Ich schrieb dieses einfache Testprogramm. Aber ich kann nicht verstehen, was hier passiert. Weil es eine seltsame Sache in der Ausgabe ist:Was passiert am Ende mit dem Iterator, wenn ein Listenelement gelöscht wird?
std::list<std::pair<double,double>> l;
l.push_back({0.3,0.9});
l.push_back({-0.3,0.5});
l.push_back({0.3,0.7});
l.push_back({1.2,1.83});
for(auto it=l.begin(); it!=l.end(); ++it){
double lx= it->first + 0.01;
double ly= it->second + 0.01;
it->first = lx;
it->second = ly;
if(lx < 0.0 || lx > 1.0 || ly < 0.0 || ly > 1.0){
it = l.erase(it);
}
Wenn ich die Liste zu drucken, erhalte ich:
0.32, 0.92
0.31, 0.71
Warum funktioniert der Iterator auf das erste Element geht zurück (zweimal +0,1)?
Das '== 0' im if ist überflüssig, in der Tat ist das ganze if unbrauchbar, weil das' it! = End() 'dafür sorgen wird. Und ich bin mir nicht sicher, warum du gesagt hast, dass das erste Element zweimal da ist? Es sieht so aus, als ob Sie Elemente an Position 1 und 3 entfernen und daher die Elemente 0 und 2 drucken. – Borgleader
Danke für die Antwort. Ja, es druckt Element 0 und 2, aber es addiert 0,1 zweimal am ersten Element. Ich kann nicht verstehen, warum: Es sollte (0,31, 0,91) und (0,31,0,71) – Susliks
sein. Ein typisches Muster dafür ist das * Erase-Remove-Idiom * mit 'I.Erase (Std: : remove_if (...), l.end()) '. – ArchbishopOfBanterbury