根据我发现的一些 STL 文档,在 std::list 中插入或删除元素不会使迭代器失效。这意味着允许循环列表(从begin()
to 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
, but abcccba
。没错,又多了一个c。
看起来第一个push_back也改变了用rbegin()初始化的迭代器的值。在push_back之后,它不再指向列表中的第三个元素(以前是最后一个),而是指向第四个元素(现在是最后一个)。
我使用 Visual Studio 2010 和 GCC 对此进行了测试,两者都返回相同的结果。
这是一个错误吗?或者我不知道的反向迭代器的一些奇怪行为?