根据我找到的STL文档,向std :: list中插入或删除元素不会使迭代器无效。这意味着可以循环遍历列表(从
看起来第一个push_back也改变了用rbegin()初始化的迭代器的值。在push_back之后,它不再指向列表中的第三个元素(先前是最后一个元素),而是指向第四个元素(现在是最后一个元素)。
我用Visual Studio 2010和GCC都测试过,两者都返回相同的结果。
这是一个错误吗?还是我不知道的reverse iterators的一些奇怪行为?
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都测试过,两者都返回相同的结果。
这是一个错误吗?还是我不知道的reverse iterators的一些奇怪行为?