Dringend: --end() == letztes gültiges element
-
Wenn ich bei einer Liste den Iterator von end() um 1 dekrementiere, habe ich dann einen gültigen Iterator auf das (letzte) Element der Liste?
-
cppreference.com schrieb:
"Note that before you can access the last element of the list using an iterator that you get from a call to end(), you'll have to decrement the iterator first."
Also sollte --end() funktionieren.
Sicher, dass du aber nicht lieber eins von denen hier benützen willst:
rbegin()
back()?
MfG SideWinder
-
back() liefert mir ja eine Referenz ich will aber einen Iterator und rbegin liefert ja einen reverse_iterator, den ich erst umwandeln müsste zu einem iterator
Daher ist das halt der direkteste Weg.
-
SideWinder schrieb:
Also sollte --end() funktionieren.
leider nicht. end() ist ein rvalue. zwar wird ein listiterator niemals ein einfacher pointer sein. aber operator-- muss nicht so überladen sein, dass dieser auf rvalues aufrufbar ist. das wäre der fall, wenn operator-- als freie funktion implementiert ist. ein variable, die end() direkt entgegennimmt, ist also notwendig.
-
Du meinst also:
iterator it = myList.end(); --it;So verwende ich das auch, aber es war mir nicht bewusst, dass --end() nicht unbedingt fuktionieren muss. Danke.
-
Afaik ist die gängige Praxis folgende:
if(!container.empty() && iter == container.end()-1){...Wie camper schon saget das mit dem --end() "kann" gut gehen muss aber nicht. Und deshalb ist es besser container.end()-1 zu wählen.
BR
Vinzenz
-
container.end()-1funktioniert allerdings nur mit random-access-iteratoren. allerdings gibt es ja auch noch boost::next und boost::prior für diesen zweck. also
if(!container.empty() && iter == boost::prior(container.end()))nat. könnte man in diesem falle tatsächlich genausogut mit back() arbeiten:
if(!container.empty() && &*iter == &container.back())