103 votes

Comment obtenir un certain élément dans une liste, étant donné la position ?

Donc j'ai une liste :

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

Je ne suis pas sûr mais je suis persuadé qu'il s'agit du "0ème" élément du tableau. Existe-t-il une fonction que je puisse utiliser et qui renvoie "monObjet" ?

Object copy = myList.find_element(0);

?

140voto

James McNellis Points 193607

Si vous avez fréquemment besoin d'accéder au Nième élément d'une séquence, std::list qui est implémenté comme une liste doublement liée, n'est probablement pas le bon choix. std::vector o std::deque serait probablement meilleur.

Cela dit, vous pouvez obtenir un itérateur jusqu'au Nième élément en utilisant 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'
}

Pour un conteneur qui ne fournit pas d'accès aléatoire, comme std::list , std::advance appelle operator++ sur l'itérateur N times. Alternativement, si votre implémentation de la bibliothèque standard le fournit, vous pouvez appeler std::next :

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

std::next est en fait un appel à std::advance ce qui facilite l'avancement d'un itérateur. N fois avec moins de lignes de code et moins de variables mutables. std::next a été ajouté dans C++11.

40voto

Nawaz Points 148870

std::list ne fournit pas de fonction permettant d'obtenir un élément en fonction d'un indice. Vous pouvez essayer de l'obtenir en écrivant du code, ce que je ne recommande pas, car cela serait inefficace si vous devez le faire fréquemment.

Ce dont vous avez besoin est : std::vector . Utilisez-le comme :

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

Object obj = objects[0]; //get element given an index

8voto

furas Points 9923
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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X