std :: list迭代器是唯一且持久的吗?

时间:2017-01-11 22:18:23

标签: c++11 stl iterator

我知道std::list迭代器are Equality Comparable(作为双向迭代器)。现在,以下代码定义明确并保证打印“相等”吗?

std::list<int> nums = { 1, 2, 3 };
std::list<int>::iterator a = std::find(nums.begin(), nums.end(), 1);
nums.push_front(0);
std::list<int>::iterator b = std::find(nums.begin(), nums.end(), 1);
if (a == b) std::cout << "equal" << std::endl;

works for me,但这并不意味着它定义明确或有保障!

换句话说,如果在不同的时间找到特定std::list条目的迭代器(可能在其间添加或删除了其他元素),两个迭代器是否保证相等?

这个问题具体是关于std::list迭代器(如果重要的话),但是一般来说也涵盖其他STL容器的答案非常好!

2 个答案:

答案 0 :(得分:3)

是。保证std::list,但不是(比如)矢量。

[list.modifiers] / 1表示(关于所有对insert,push_back等的调用):&#34; 备注:不影响迭代器和引用的有效性&#34; < / p>

[vector.modifiers] / 1代替:&#34; 备注:如果新大小大于旧容量,则会导致重新分配。重新分配使引用序列中元素的所有引用,指针和迭代器无效。如果没有重新分配,插入点之前的所有迭代器和引用仍然有效。 &#34;

答案 1 :(得分:2)

假设两个迭代器都有效(在这种情况下它们是有效的),它是明确定义和保证的。这就是如何定义(前向和更专业)迭代器之间的相等性。

[forward.iterators](标准草案)

  

5如果a和b相等,那么a和b都是可解除引用的,或者两者都不可解除引用。

     

6如果a和b都是可解除引用的,那么a == b当且仅当* a和* b绑定到同一个对象时。

由于你的迭代器a和b指向同一个对象,它们必须比较相等。

  

(可能已经添加或删除了其他元素)

对于某些容器,这可能会影响修改前创建的迭代器的有效性。如果其中一个迭代器失效,则不再保证它指向它曾经使用过的对象。实际上,根本不会保证指向容器,因此不会定义比较结果。

std::list的非结束迭代器尤其不会失效,除非它们指向的特定元素被删除。每个容器都有自己的失效规则,必须从文档中查找。