【发布时间】:2012-04-22 13:20:15
【问题描述】:
根据我发现的一些 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 Studio 2010 和 GCC 对此进行了测试,都返回了相同的结果。
这是一个错误吗?还是我不知道的反向迭代器的一些奇怪行为?
【问题讨论】: