根据我发现的一些 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()
to循环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 对此进行了测试,并且都返回了相同的结果。
这是一个错误吗?还是我不知道的反向迭代器的一些奇怪行为?