C++列出迭代器reverse_iterator

C++ list iterator reverse_iterator

本文关键字:iterator reverse 迭代器 C++      更新时间:2023-10-16

可能的重复项:
为什么 std::list 上的push_back会更改使用 rbegin 初始化的反向迭代器?

我得到了一段代码,如下所示:

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