首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么std::list上的push_back会改变用rbegin初始化的反向迭代器?

为什么std::list上的push_back会改变用rbegin初始化的反向迭代器?
EN

Stack Overflow用户
提问于 2012-04-10 16:42:50
回答 1查看 5.6K关注 0票数 21

根据我找到的一些STL文档,在std::list中插入或删除元素并不会使迭代器无效。这意味着允许它遍历列表(从begin()end()),然后使用push_front添加元素。

例如,在下面的代码中,我初始化了一个包含元素a、b和c的列表,然后循环遍历该列表并执行元素的push_front。结果应该是cbaabc,这正是我得到的结果:

代码语言:javascript
复制
std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");

for (std::list<std::string>::iterator itList = testList.begin(); itList != testList.end(); ++itList)
   testList.push_front(*itList);

for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
   std::cout << *itList << std::endl;

当我使用反向迭代器(从rbegin()循环到rend())和使用push_back时,我会期望类似的行为,即abccba的结果。然而,我得到了一个不同的结果:

代码语言:javascript
复制
std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");

for (std::list<std::string>::reverse_iterator itList = testList.rbegin(); itList != testList.rend(); ++itList)
   testList.push_back(*itList);

for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
   std::cout << *itList << std::endl;

结果不是abccba,而是abcccba。这就对了,增加了一个c。

看起来第一个push_back也改变了用rbegin()初始化的迭代器的值。在push_back之后,它不再指向列表中的第三个元素(以前是最后一个),而是第四个元素(现在是最后一个)。

我用Visual Studio2010和GCC进行了测试,两者都返回了相同的结果。

这是一个错误吗?或者是我不知道的一些奇怪的反向迭代器行为?

EN

回答 1

Stack Overflow用户

发布于 2012-04-10 17:00:01

尝试使用迭代器来处理这两个问题。尝试:

代码语言:javascript
复制
std::list<std::string>::iterator i = testList.end(); 

然后反转过来--i

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10085570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档