2011-04-20 17 views
63

así que tengo una lista:¿Cómo obtener un determinado elemento en una lista, dada la posición?

list<Object> myList; 
myList.push_back(Object myObject); 

No estoy seguro, pero estoy seguro de que este sería el elemento "0 ª" en la matriz. ¿Hay alguna función que pueda usar que devuelva "myObject"?

Object copy = myList.find_element(0); 

?

+6

No hay variedad - es una lista. Si desea indexar por entero, ¿por qué no usa 'vector' en su lugar? –

+2

Si siempre quiere el elemento 0, use 'front()'. –

+0

No he probado esto, pero supongo que myList.front() + num funcionaría aquí –

Respuesta

91

Si con frecuencia necesita acceder al elemento Nth de una secuencia, std::list, que se implementa como una lista doblemente vinculada, probablemente no sea la opción correcta. std::vector o std::deque probablemente sería mejor.

Dicho esto, se puede obtener un iterador al elemento enésimo usando std::advance:

std::list<Object> l; 
// add elements to list 'l'... 

unsigned N = /* index of the element you want to retrieve */; 
if (l.size() > N) 
{ 
    std::list<Object>::iterator it = l.begin(); 
    std::advance(it, N); 
    // 'it' points to the element at index 'N' 
} 

Para un contenedor que no proporciona acceso aleatorio, como std::list, std::advance llamadas operator++ en el iterador N veces. Alternativamente, si su aplicación biblioteca estándar proporciona, usted puede llamar std::next:

if (l.size() > N) 
{ 
    std::list<Object>::iterator it = std::next(l.begin(), N); 
} 

std::next se envuelve de manera efectiva una llamada a std::advance, por lo que es más fácil para avanzar un iterador N veces con menos líneas de código y menos variables mutables. std::next se agregó en C++ 11.

+7

Mientras paga una multa de rendimiento al buscar en una lista vinculada debido a la falta de acceso aleatorio, usted paga una penalización de rendimiento mucho mayor si necesita insertar o eliminar datos en el medio de un vector o deque. La pregunta en realidad no contiene suficiente información para decidir si están usando el contenedor ideal para sus propósitos. – tloach

23

std::list no proporciona ninguna función para obtener elemento dado un índice. Puede tratar de obtenerlo escribiendo algún código, que no recomendaría, porque sería ineficiente si con frecuencia necesita hacerlo.

Lo que necesita es: std::vector. Utilizarlo como:

std::vector<Object> objects; 
objects.push_back(myObject); 

Object obj = objects[0]; //get element given an index 
4
std::list<Object> l; 
std::list<Object>::iterator ptr; 
int i; 

for(i = 0 , ptr = l.begin() ; i < N && ptr != l.end() ; i++ , ptr++); 

if(ptr == l.end()) { 
    // list too short 
} else { 
    // 'ptr' points to N-th element of list 
} 
Cuestiones relacionadas