根據我發現的一些STL文檔,插入或刪除std :: list中的元素不會使迭代器失效。這意味着它可以遍歷列表(從begin()
到end()
),然後使用push_front添加元素。例如,在下面的代碼中,我用元素a,b和c初始化一個列表,然後遍歷它並執行元素的push_front。結果應該是cbaabc,這正是我得到:爲什麼std :: list上的push_back會改變一個用rbegin初始化的反向迭代器?
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之後,它不再指向列表中的第3個元素(之前是最後一個元素),而是指向第4個元素(現在是最後一個元素)。
我用Visual Studio 2010和GCC測試了這個,並且都返回了相同的結果。
這是錯誤?或者我不知道的反向迭代器的一些奇怪的行爲?
謝謝,你有沒有參考技術細節? – Patrick 2012-04-10 09:25:44
添加了標準報價。 – 2012-04-10 09:34:11
+1。我認爲這個標準引用了它。 – 2012-04-10 09:56:07