这个问题已经在这里有了答案:
已关闭8年。
我得到了一段代码,如下所示:
#include <iostream>
#include <list>
int main(){
std::list<int> l;
l.push_back(1);
l.push_back(2);
std::list<int>::iterator it = l.begin();
std::cout << *it << std::endl; // 1
l.push_front(0);
std::cout << *it << std::endl; // 1
std::list<int>::reverse_iterator rit = l.rbegin();
std::cout << *rit << std::endl; // 2
l.push_back(3);
std::cout << *rit << std::endl; // 3
}
输出:
1
1
2
3
定义前向迭代器
it
后,如果调用push_front()
,则it
的位置将不会改变。但是,在定义了reverse_iterator rit
之后,如果我调用push_back()
,rit
的位置将会改变。应该认为这是前后矛盾的吗?对我来说,其中一个移动而另一个保持不变对我来说真的没有任何意义。
提前致谢。 :)
最佳答案
std::list
不会使迭代器无效。正如您在常规迭代器中看到的那样,即使修改了列表,std::list
上的迭代器仍指向同一元素。
另一方面,反向迭代器实现为std::reverse_iterator<iterator>
,根据C++ STL documentation,它维护一个迭代器,该迭代器指向由迭代器返回的元素之前的元素,在这种情况下,该元素是列表的末尾。