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 
} 

Czy istnieje inny sposób na iterację do ostatniego elementu na liście?Iterator na ostatni element w std :: list

+2

Dlaczego nie użyć 'n.rbegin()'? – kennytm

+4

z jakiegoś powodu, nie chcę mieć reverse_iterator. – cpx

Odpowiedz

77

Tak, możesz cofnąć się od końca. (Zakładając, że wiesz że lista nie jest pusta.)

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

W niektórych miejscach można to skrócić tak, jak w 'newlist.splice (- newlist.end(), oldlist);' – dmckee

5

Weź end() i iść jeden do tyłu.

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

Dlaczego muszę cofnąć jeden? Czy jest jakiś obojętny węzeł końcowy czy coś takiego? – Tarion

+0

@ Tarion: n.end() nie wskazuje na ostatni element, ale na samym końcu listy. – ratiotile

44

Każda z poniższych zwróci std::list<int>::iterator do ostatniego elementu w list:

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()); 

Poniższa zwróci std::list<int>::reverse_iterator do ostatniego elementu w list:

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

'back()' zwraca odwołanie do ostatniego elementu, a nie jako iteratora do ostatniego elementu; 'rbegin()' zwraca odwrotny iterator, a nie iterator. –

+6

Inwerter odwrotny jest iteratorem. To nie jest lista: iterator. –

+0

@Dennis: o to mi chodziło; Przepraszam, jeśli nie było to jasne. –

6

Z tyłu iteratorów:

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

Na marginesie: to czy metoda Charles Bailey mieć stała złożoność, podczas gdy std::advance(iter, n.size() - 1); ma liniową złożoność z listą [ponieważ ma dwukierunkowe iteratory].

+0

Dlaczego "+ + n.rbegin() "? Dla mnie to wydaje się odwrotnym iteratorem do następnego elementu. Czy "n.rbegin(). Base()" (bez "++") nie będzie iteratorem do ostatniego elementu? – zentrunix

+0

@ JoséX. Funkcja base() nie jest tylko skrótem do rzutowania odwrotnego iteratora w iterator do przodu. Spójrz na tę odpowiedź, aby uzyskać więcej informacji na temat bazy: http://stackoverflow.com/a/16609146/153861 –

1

Można napisać własne funkcje, aby uzyskać poprzednią (i następne) iterator z danym jednego (który użyłem kiedy już potrzebne „look-tył” i „antycypowana” z std::list):

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

A potem:

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

BTW, to może również być dostępny w bibliotece Boost (next and prior).

+5

Jest to również dostępne w C++ 0x ('std :: next' i' 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

Wyjaśnienie kodu, który wysłałeś, jeszcze bardziej poprawi twoją odpowiedź. –

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