Das scheint ein einfaches Problem zu sein, und es ist sicherlich machbar, aber ich würde es gerne effizient machen.
Das Ziel :
Entfernen Sie das letzte Element aus einer std :: list, wenn es eine Bedingung erfüllt.
Das Problem :
Mein Compiler (MSVC ++ 10) ist unglücklich darüber, einen Reverse-Iterator für einen Methodenaufruf an std :: list.erase () in einen Const-Iterator umzuwandeln. Die Nachricht lautet:
%Vor%
Der Code, den ich versucht habe :
%Vor%Ich kann das umgehen, indem ich Vorwärts-Iteratoren benutze und die Liste bis zum Ende durchlaufe, aber das ist so umständlich. Der Compiler ist OK mit einem Vorwärts-Iterator in diesem Kontext, und ich habe versucht, den Rückwärts-Iterator auf einen Const-Iterator zu setzen, aber der Compiler hat das auch nicht gemocht.
Das Löschen eines Listenelements aus einer bidirektionalen Liste mit einem umgekehrten Iterator scheint eine vernünftige Sache zu sein. Gibt es etwas Offensichtliches, dass ich hier vermisse?
Ich nehme an, dass Sie Ihr Code-Snippet auf die nächste Art vereinfachen können:
%Vor%Um den spezifischen Fehler in Ihrem Code zu beheben Can Ich konvertiere einen Reverse-Iterator in einen Vorwärts-Iterator?
%Vor%Verwenden Sie std :: reverse_iterator :: base
Der
base
Iterator verweist auf das Element, das als nächstes (aus der Perspektivestd::reverse_iterator::iterator_type
) auf das Element verweist, auf dasreverse_iterator
gerade zeigt.
Wie auch immer, pop_back
ist in Ihrem Fall die beste Wahl.