2

可能重复:
为什么 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,如果我调用WILL NOTpush_front()的位置。it但是,在我定义 reverse_iterator 之后rit,如果我调用push_back()ritWILL 的位置会改变。

这应该被视为不一致吗?对我来说,其中一个移动而另一个保持不变对我来说真的没有任何意义。

提前致谢。:)

4

1 回答 1

-1

std::list不会使迭代器无效。正如您在常规迭代器中看到的那样,std::list即使在列表被修改后,迭代器也指向同一个元素。

另一方面,反向迭代器被实现为std::reverse_iterator<iterator>,根据C++ STL 文档,它维护一个迭代器,该迭代器指向迭代器返回的元素之前的元素,在这种情况下,它是列表的末尾。

于 2012-09-22T06:59:23.020 回答