11

我试图利用这样一个事实,即列表的迭代器在插入和删除后仍然有效(除了你刚刚删除的迭代器)。这也是真的吗std::list<T>::end();

假设我尝试以下操作:

typedef std::list<int> list_int;

list_int myList;
list_int::iterator iter = myList.end();

myList.push_back(1);
myList.push_back(2);
myList.push_back(3);

if(iter == myList.end()) {
    /* do things here */
} else {
    /* do different things here */
    /* I don't expect this branch to ever execute */
}

这很重要,因为在其他地方我可能会将一组迭代器存储到这个列表中,并且我会通过与myList.end(). 重要的是,即使在插入和删除之后,无效的迭代器仍然如此。

4

2 回答 2

18

std::lists 结束迭代器的值在列表的生命周期内永远不会改变。它总是有效的,总是相同的,并且总是对应于列表中虚构的“结束”元素。这意味着some_list.end()memorized 在列表生命周期中的任何时间点的值将始终some_list.end()与其生命周期中任何其他点的值相同。

语言规范没有明确说明。但是,列表上根本没有有效的操作会使结束迭代器无效或将其值与其他位置相关联。

在您的示例中,第二个分支if将永远不会执行。

如果我没有遗漏任何东西,那么同样std::map如此std::set

于 2012-10-26T03:31:28.870 回答
0

cout您是否尝试过在 IF 语句的每个子句中放置一个简单的测试?通过这样做,您将意识到第一个子句 ( iter == myList.end()) 确实是true

我将根据 end() 函数的文档进行推理:http ://www.cplusplus.com/reference/stl/list/end/ 。它说:“返回一个迭代器,该迭代器引用列表容器中的最后一个元素。” 因此,如果返回指向过去的迭代器,那么它不应该总是指向过去吗?在此结束点之前插入的元素不应影响迭代器指向的位置(即列表最后一个元素之后的位置)。

于 2012-10-26T02:50:24.523 回答