我正在尝试使用这样一个事实,即插入和删除之后列表的迭代器仍然有效(除了刚删除的迭代器之外)。 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()
进行比较来测试有效性。重要的是,即使在插入和删除之后,无效的迭代器也会保持不变。
答案 0 :(得分:17)
std::list
s end迭代器的值在列表的生命周期内永远不会改变。它始终有效,始终相同,并始终对应于列表中虚构的“过去结束”元素。这意味着列表生命周期中任何一点所记忆的some_list.end()
值始终与其生命周期中任何其他点的some_list.end()
值相同。
语言规范没有明确说明。但是,列表上没有有效操作会使结束迭代器无效或将其值与其他位置相关联。
在您的示例中,if
的第二个分支将永远不会执行。
如果我没有遗漏任何内容,std::map
和std::set
也是如此。
答案 1 :(得分:0)
您是否通过在IF语句的每个子句中放置cout
来尝试进行简单测试?通过这样做,您将意识到第一个子句(iter == myList.end()
)确实是 true 。
我将基于end()函数的文档简化我的推理:http://www.cplusplus.com/reference/stl/list/end/。它说:“返回一个迭代器,引用列表容器中的 past-the-end 元素。”因此,如果返回指向 past-the-end 的迭代器,那么它是否应该始终指向 past-the-end ?在 past-the-end 点之前插入的元素不应该影响迭代器指向的位置(这是列表的最后一个元素之后的位置)。