已经搜索了很多网,但找不到问题的答案。
我使用reverse_iterator将值插入std :: list。虽然插入发生在预期的适当位置,但我注意到用于插入的原始reverse_iterator的值发生了变化。此外,完全不相关的reverse_iterator的值也会发生变化。我已经能够在一个简单的例子中重现这个
#include <iostream>
#include <list>
#include <string>
int main()
{
// Creating a list of values 1, 2, 4, 5
std::list<int> myList;
myList.push_back(1);
myList.push_back(2);
myList.push_back(4);
myList.push_back(5);
// Changing it to 1, 2, 3, 4, 5 by inserting 3
std::list<int>::reverse_iterator revIter = myList.rbegin();
while(2 != *revIter)
{
std::cout << *revIter << "\t";
++revIter;
}
std::cout << "\n" << "Reverse iterator now points to " << *revIter;
// Creating a copy of the reverse Iter before inserting.
std::list<int>::reverse_iterator newRevIter = revIter;
myList.insert(revIter.base(), 3);
// Checking the values of revIter and newRevIter
std::cout << "\n" << "Reverse Iterator now points to " << *revIter; // UNEXPECTED RESULT HERE
std::cout << "\n" << "New Reverse Iterator now points to " << *newRevIter; // UNEXPRECTED RESULT HERE
std::cout << "\n" << "Printing final list:" << "\n";
for(std::list<int>::iterator iter = myList.begin(); myList.end() != iter; ++iter)
{
std::cout << *iter << "\t"; // Results are fine
}
return 0;
}
RESULT
5 4
Reverse iterator now points to 2
Reverse iterator now points to 3
New Reverse iterator now points to 3
Printing final list:
1 2 3 4 5
这是预期的行为吗?如果是这样,如何使用反向迭代器将项目插入列表(或者在这方面它是无用的)?
答案 0 :(得分:4)
我会避免使用反向迭代器(一般来说,特别是对于顺序横向以外的任何东西)。正向和反向迭代器的工作方式不同,在前向迭代器进入列表的情况下,迭代器跟踪您通过operator*
访问的节点,但在相反的情况下,迭代器跟踪列表中的下一个元素。取消引用反向迭代器的行为获取迭代器引用的节点的前导,并从中提取值。图形化(f是前向迭代器,r是反向迭代器)
f
1 2 4
r
前向迭代器f和反向迭代器r在取消引用时将产生2,但它们跟踪的节点是不同的。使用r插入时,插入2和4之间,但底层迭代器指向保持4的节点:
f
1 2 3 4
r
现在,如果您取消引用r,则应用与上述相同的过程。获取当前节点的前身,并打印出值,但现在4的前身是3,这就是你得到的。
这是预期的行为吗?如果是这样,如何使用反向迭代器将项目插入列表(或者在这方面它是无用的)?
是的,这是预期的行为。如何使用反向迭代器将项目插入列表?了解它是如何工作的。
答案 1 :(得分:0)
插入后的不变量是std::reverse_iterator<>::base()
,而不是std::reverse_iterator<>
本身。但是,与base()
相比,reverse_iterator
确实将之前的元素作为目标:
http://en.cppreference.com/w/cpp/iterator/reverse_iterator
当我对std::distance
(或begin()
)rend().base()
std::cout << "\n"
<< "Reverse Iterator now points to "
<< *revIter << "-" << *(revIter.base())<< "-"
<< std::distance(revIter.base(), myList.rend().base());
时,让我感到困扰的是:
base()
我有:
反向迭代器现在指向2-4-3
反向迭代器现在指向3-4-3
或者我希望第二个是“3-4-4”,因为元素是在{{1}}之前插入的......