这个问题已经在这里有了答案:




已关闭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,它维护一个迭代器,该迭代器指向由迭代器返回的元素之前的元素,在这种情况下,该元素是列表的末尾。

08-17 07:00
查看更多