我试图利用这样一个事实,即列表的迭代器在插入和删除后仍然有效(除了刚删除的迭代器)。 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()
进行比较来测试有效性。 .重要的是,即使在插入和删除之后,无效的迭代器仍然存在。
最佳答案
std::list
的结束迭代器的值在列表的生命周期内永远不会改变。它总是有效的,总是相同的,并且总是对应于列表的虚构的“结束”元素。这意味着 some_list.end()
在列表生命周期中的任何时刻内存的值将始终与 some_list.end()
在任何其他时刻的值相同生命周期的终点。
语言规范没有明确说明。但是,列表上根本没有有效操作会使结束迭代器无效或将其值与其他位置相关联。
在您的示例中,if
的第二个分支永远不会执行。
如果我没有遗漏任何东西,std::map
和 std::set
也是如此。
关于c++ - 修改列表后 std::list<T>::end() 的值是否改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13080013/