2010-04-20 13 views
46
#include <list> 
using std::list; 

int main() 
{ 
    list <int> n; 
    n.push_back(1); 
    n.push_back(2); 
    n.push_back(3); 

    list <int>::iterator iter = n.begin(); 
    std::advance(iter, n.size() - 1); //iter is set to last element 
} 

Gibt es eine andere Möglichkeit, ein Iter zum letzten Element in der Liste zu haben?Iterator zum letzten Element in Std :: Liste

+2

Warum nicht 'n.rbegin()'? – kennytm

+4

aus irgendeinem Grund möchte ich keinen reverse_iterator haben. – cpx

Antwort

77

Ja, Sie können vom Ende zurückgehen. (Unter der Annahme, dass Sie wissen , dass die Liste nicht leer ist.)

std::list<int>::iterator i = n.end(); 
--i; 
+0

An einigen Stellen kann dies verkürzt werden wie in 'newlist.splice (- newlist.end(), oldlist);' – dmckee

5

die end() nehmen und ein nach hinten gehen.

list <int>::iterator iter = n.end(); 
cout << *(--iter); 
+0

Warum muss ich einen rückwärts gehen? Gibt es einen Dummy-Endknoten oder etwas? – Tarion

+0

@Tarion: n.end() zeigt nicht auf das letzte Element, sondern direkt auf das Ende der Liste. – ratiotile

44

Eine der folgenden wird eine std::list<int>::iterator zum letzten Punkt in der list zurück:

std::list<int>::iterator iter = n.end(); 
--iter; 

std::list<int>::iterator iter = n.end(); 
std::advance(iter, -1); 

// C++11 
std::list<int>::iterator iter = std::next(n.end(), -1); 

// C++11 
std::list<int>::iterator iter = std::prev(n.end()); 

Im Folgenden wird ein std::list<int>::reverse_iterator zum letzten Punkt in der list zurück:

std::list<int>::reverse_iterator iter = std::list::rbegin(); 
+37

'back()' gibt einen Verweis auf das letzte Element zurück, keinen Iterator auf das letzte Element; 'rbegin()' liefert einen Reverse-Iterator, keinen Iterator. –

+6

Ein Reverse-Iterator ist ein Iterator. Es ist einfach kein list :: iterator. –

+0

@Dennis: Was ich meinte; Entschuldigung, wenn es nicht klar war. –

6

Mit Reverse-Iteratoren:

iter = (++n.rbegin()).base() 

Als Randnotiz: diese oder Charles Bailey Verfahren haben konstante Komplexität, während std::advance(iter, n.size() - 1); lineare Komplexität mit Liste [da es bidirektionale Iteratoren] hat.

+0

Warum "+ + n.rbegin() "? Das scheint mir ein umgekehrter Iterator für das vorletzte Element zu sein. Wäre nicht "n.rbegin(). Base()" (ohne "++") der Iterator für das letzte Element? – zentrunix

+0

@ JoséX. base() ist nicht nur eine Abkürzung, um einen Reverse-Iterator in einen Vorwärts-Iterator umzuwandeln. Sehen Sie sich diese Antwort an, um weitere Informationen zu base zu erhalten: http://stackoverflow.com/a/16609146/153861 –

1

Sie könnten Ihre eigenen Funktionen schreiben ein früheres (und neben) Iterator aus dem gegebenen zu erhalten (die ich verwendet habe, wenn ich gebraucht habe „Look-Behind“ und „Look-Ahead“ mit einem std::list):

template <class Iter> 
Iter previous(Iter it) 
{ 
    return --it; 
} 

Und dann:

std::list<X>::iterator last = previous(li.end()); 

BTW, könnte dies auch in der Boost-Bibliothek (next and prior) zur Verfügung stehen.

+5

Dies ist auch in C++ 0x verfügbar ('std :: next' und' std :: prev')). –

0
list<int>n; 
list<int>::reverse_iterator it; 
int j; 

for(j=1,it=n.rbegin();j<2;j++,it++) 
cout<<*it; 
+3

Erklären Sie den Code, den Sie gepostet haben, würde Ihre Antwort noch besser machen. –

5
std::list<int>::iterator iter = --n.end(); 
cout << *iter; 
Verwandte Themen