Laut einiger STL-Dokumentation, die ich gefunden habe, das Einfügen oder Löschen von Elementen in einer std :: list Iteratoren nicht ungültig. Das bedeutet, dass eine Schleife über eine Liste (von begin()
bis end()
) möglich ist. Fügen Sie dann Elemente mithilfe von push_front hinzu.Warum ändert ein push_back auf einer std :: list einen umgekehrten Iterator, der mit rbegin initialisiert wurde?
Zum Beispiel initialisiere ich im folgenden Code eine Liste mit den Elementen a, b und c, kreise dann darüber und führe eine push_front der Elemente aus. Das Ergebnis sollte cbaabc sein, was genau das ist, was ich bekommen:
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;
Wenn ich Reverse-Iteratoren verwenden (Schleife rbegin()
-rend()
) und verwenden push_back, ich würde erwarten, dass ein ähnliches Verhalten, das heißt aufgrund der abccba. Ich erhalte jedoch ein anderes Ergebnis:
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;
Das Ergebnis nicht abccba
, aber abcccba
. Das ist richtig, da ist ein zusätzliches c hinzugefügt.
Es sieht so aus, als ob die erste push_back auch den Wert des Iterators ändert, der mit rbegin() initialisiert wurde. Nach dem push_back zeigt es nicht mehr auf das dritte Element in der Liste (welches vorher das letzte war), sondern auf das vierte Element (welches nun das letzte ist).
Ich habe dies mit Visual Studio 2010 und mit GCC getestet und beide das gleiche Ergebnis zurückgeben.
Ist das ein Fehler? Oder ein seltsames Verhalten von Reverse-Iteratoren, die mir nicht bekannt sind?
Danke, haben Sie eine Referenz für die technischen Details? – Patrick
Hinzugefügt ein Zitat aus dem Standard. –
+1. Ich denke, dass Zitat von der Norm es klammert. –