在修改列表后,std :: list< t> :: end()的值是否会更改
Does the value of std::list<T>::end() change after modifying list?
我正在尝试利用以下事实,即迭代列表后列表在插入和删除后保持有效(除了迭代器除外,您刚刚删除的内容)。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
s结束迭代器的值在列表的寿命中永远不会更改。它总是有效的,总是相同的,并且总是对应于列表的虚构"过去"元素。这意味着some_list.end()
在列表寿命中的任何时刻记忆的值始终与some_list.end()
的寿命其他任何点相同。
语言规范未明确说明。但是,列表上根本没有任何有效的操作可以使结束迭代器无效或将其值与其他位置相关联。
在您的示例中,该if
的第二个分支将永远不会执行。
如果我不丢失任何东西,那么std::map
和std::set
也是如此。
您是否通过在if语句的每个子句中放置cout
来尝试简单的测试?通过这样做,您将意识到 first 子句(iter == myList.end()
)确实是 true 。
我将简单地基于end()函数的文档:http://www.cplusplus.com/reference/reference/stl/list/end/。它说:"返回涉及列表容器中过去的元素的迭代器。"因此,如果返回了 em>末端的迭代器,那么难道不应该总是指向过去的末端?在此之前插入的元素点不应影响迭代器指向的位置(这是列表的最后一个元素之后的点)。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 我当前实现的双向链表类是否需要重构迭代器 end() 功能?
- 是否保证C++向量v的v.begin()+v.size()==v.end()
- 是否可以使用 begin() 和 end() 创建 std::array?
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- PostgreSQL 是否计算嵌套的 BEGIN 和 END 语句,即使它不支持自治事务?
- 我读了map.erase(map.end());删除地图的最后一个元素。但是最后一个元素是什么?它是否基于元素的插入顺序?
- 迭代器失效 - end() 是否算作迭代器
- i = v.end() 是否可以从 for 循环中优化出来
- 在“abcd”和“abc”的情况下,“std::equal”是否取消引用“end()”
- std::find返回vec.end(),而不管值是否在vector中
- 在c++中从container.end()中进行减法是否安全?
- 当字符串被" "或向量没有元素时,'begin()' 是否等于 'end()'?
- 是否有可能在运行时检查迭代器是否没有越过end()迭代器
- ->秒是否为迭代器 std::map::end()?
- istream::seekg与ios_base::end是否可靠?
- std::list::清除是否使 std::list::end 迭代器无效
- 我可以测试wstring::迭代器是否与非特定的::end相等吗?