根据我找到的一些STL文档,在std::list中插入或删除元素并不会使迭代器无效。这意味着允许它遍历列表(从begin()
到end()
),然后使用push_front添加元素。
例如,在下面的代码中,我初始化了一个包含元素a、b和c的列表,然后循环遍历该列表并执行元素的push_front。结果应该是cbaabc,这正是我得到的结果:
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的结果。然而,我得到了一个不同的结果:
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进行了测试,两者都返回了相同的结果。
这是一个错误吗?或者是我不知道的一些奇怪的反向迭代器行为?
发布于 2012-04-10 17:00:01
尝试使用迭代器来处理这两个问题。尝试:
std::list<std::string>::iterator i = testList.end();
然后反转过来--i
https://stackoverflow.com/questions/10085570
复制相似问题