c++ - 修改列表后 std::list<T>::end() 的值是否改变?

标签 c++ list stl iterator

我试图利用这样一个事实,即列表的迭代器在插入和删除后仍然有效(除了刚删除的迭代器)。 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::mapstd::set 也是如此。

关于c++ - 修改列表后 std::list<T>::end() 的值是否改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13080013/

相关文章:

c++ - std::vectors 是否应该广泛用于嵌入式系统?

c++ - 如何找到Qt应用程序的安装目录?

python - 在字符之间查找多个字符串

c++ - 像 lower_bound() 这样的算法,但是另一个

c# - 是否应该将此列表初始值设定项行为报告为 Visual Studio C# 编译器中的错误?

python - 从字典列表中删除重复的字典

c++ - 公开自定义 STL 样式迭代的首选方法是什么?

c++ - 如果在从头到尾迭代时在 map 元素上调用 erase() 会发生什么?

c++ - pthread sleep linux

c++ - 供应商是否将 new 和 malloc 实现为小对象分配器?