joh*_*zac 6 c++ stdlist reverse-iterator
已经搜索了很多网,但找不到问题的答案.
我使用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;
}
Run Code Online (Sandbox Code Playgroud)
结果
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
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?如果是这样,如何使用反向迭代器将项目插入列表(或者在这方面它是无用的)?
我会避免使用反向迭代器(一般来说,特别是对于顺序遍历以外的任何事情)。正向和反向迭代器的工作方式不同,在正向迭代器进入列表的情况下,迭代器跟踪您通过 访问的节点operator*,但在相反的情况下,迭代器跟踪列表中的下一个元素。取消引用反向迭代器的行为获取迭代器引用的节点的前驱并从中提取值。用图形表示(f是正向迭代器,r是反向迭代器)
f
1 2 4
r
Run Code Online (Sandbox Code Playgroud)
正向迭代器 f 和反向迭代器 r 在解引用时都会产生 2,但它们跟踪的节点不同。当您使用 r 插入时,您会在 2 和 4 之间插入,但底层迭代器仍指向保存 4 的节点:
f
1 2 3 4
r
Run Code Online (Sandbox Code Playgroud)
现在,如果您取消引用 r,则应用与上述相同的过程。获取当前节点的前驱,并打印值,只不过现在 4 的前驱是 3,这就是您得到的。
这是预期的行为吗?如果是这样,如何使用反向迭代器将项目插入到列表中(或者在这方面它是无用的)?
是的,这是预期的行为。如何使用反向迭代器将项目插入列表?了解它是如何工作的。
| 归档时间: |
|
| 查看次数: |
1841 次 |
| 最近记录: |