Entferne effizient das letzte Element von std :: list

8

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?

    
vacuumhead 22.04.2016, 22:08
quelle

2 Antworten

8

Ich nehme an, dass Sie Ihr Code-Snippet auf die nächste Art vereinfachen können:

%Vor%     
Edgar Rokjān 22.04.2016, 22:18
quelle
3

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 Perspektive std::reverse_iterator::iterator_type ) auf das Element verweist, auf das reverse_iterator gerade zeigt.

Wie auch immer, pop_back ist in Ihrem Fall die beste Wahl.

    
gdlmx 22.04.2016 22:37
quelle

Tags und Links