2010-04-20 14 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 
} 

¿Hay alguna otra forma de tener un iter en el último elemento de la lista?Iterador al último elemento en std :: list

+2

Por qué no usar 'n.rbegin()'? – kennytm

+4

por alguna razón, no quiero tener un reverse_iterator. – cpx

Respuesta

77

Sí, puede ir uno desde el final. (Asumiendo que sabe que la lista no está vacía.)

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

En lugares esto se puede acortar como en 'newlist.splice (- newlist.end(), oldlist);' – dmckee

5

Tome la end() e ir uno hacia atrás.

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

¿Por qué tengo que ir hacia atrás? ¿Hay un nodo final ficticio o algo así? – Tarion

+0

@Tarion: n.end() no apunta al último elemento, sino al final de la lista. – ratiotile

44

Cualquiera de las siguientes devolverá un std::list<int>::iterator al último elemento de la 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()); 

El siguiente devolverá un std::list<int>::reverse_iterator al último elemento de la list:

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

'back()' devuelve una referencia al último elemento, no un iterador al último elemento; 'rbegin()' devuelve un iterador inverso, no un iterador. –

+6

Un iterador inverso es un iterador. Simplemente no es una lista :: iterador. –

+0

@Dennis: que es lo que quise decir; lo siento si no estaba claro. –

6

Con iteradores inversa:

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

Como nota al margen: este o método Charles Bailey tiene complejidad constante, mientras que std::advance(iter, n.size() - 1); tiene una complejidad lineal con la lista [ya que tiene iteradores bidireccionales].

+0

Why "+ + n.rbegin() "? Para mí eso parece un iterador inverso al penúltimo elemento. ¿No sería n.rbegin(). Base() "(sin el" ++ ") el iterador del último elemento? – zentrunix

+0

@ JoséX. base() no es solo una abreviatura para convertir un iterador inverso en un iterador directo. Eche un vistazo a esta respuesta para obtener más información sobre la base: http://stackoverflow.com/a/16609146/153861 –

1

Se puede escribir sus propias funciones para obtener un iterador anterior (y siguiente) de la dada (que he usado cuando he necesitado "mirar detrás" y con un std::list "visto bueno mirar"):

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

Y luego:

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

por cierto, esto también puede estar disponible en la biblioteca de impulso (next and prior).

+5

Esto también está disponible en C++ 0x ('std :: next' y' 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

Explicar el código que publicaste mejoraría tu respuesta. –

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