2013-05-25 14 views
6

Mam list:Jak uzyskać element w określonym indeksie z C++ Lista

list<Student>* l; 

i chciałbym uzyskać element o określonym indeksie. Przykład:

l->get(4)//getting 4th element 

Czy jest funkcja lub metoda w list, która umożliwia to zrobić?

+2

To nasuwa pytanie: dlaczego? Czy na pewno chcesz listę? –

+2

Oprócz tego, co powiedział @LightnessRacesinOrbit, jeśli jesteś pewien, że potrzebujesz "listy", czy na pewno chcesz * wskaźnik * do "listy"? – juanchopanza

Odpowiedz

8

nie ma iteratora dostępu losowego, dlatego należy wykonać 4-krotny krok z iteratora przedniego. Możesz to zrobić ręcznie lub z std::advance lub std::next w C++ 11, ale pamiętaj, że obie operacje O (N) dla listy.

#include <iterator> 
#include <list> 

.... 

std::list<Student> l; // look, no pointers! 
auto l_front = l.begin(); 

std::advance(l_front, 4); 

std::cout << *l_front << '\n'; 

Edit: Oryginalny pytanie poproszony o wektorze też. To teraz nieistotne, ale mimo to może być pouczające:

std::vector ma przypadkowych iteratory dostępu, dzięki czemu można wykonać równoważne działanie w czasie O (1) za pośrednictwem std::advance, std::next jeśli masz 11 wsparcie C++ [] operator lub funkcja at() członkiem:

std::vector<Student> v = ...; 
std::cout << v[4] << '\n'; // UB if v has less than 4 elements 
std::cout << v.at(4) << '\n'; // throws if v has less than 4 elements 
+0

+1, jesteś szybszy :) – Maroun

0

Dla std::vector można użyć

myVector.at(i) // pobranie Ith elementowi

+1

Mam nadzieję, że to nie będzie bardziej istotne, kiedy zmieniłeś swój wpis z listy lub wektora na listę tylko – simpleuser

+1

zwróć uwagę, że to rozwiązanie wymaga sprawdzania granic w czasie działania, więc prawdopodobnie będzie wolniejsze niż użycie 'operator []'. – Andrei

+1

@Andrei Może to zająć więcej czasu, ale potem jest obsługiwany z wdziękiem. – simpleuser

1

Jeśli chcesz mieć dostęp losowy do elementów, powinieneś użyć vector, a następnie możesz użyć operatora [], aby uzyskać 4. element.

vector<Student> myvector (5); // initializes the vector with 5 elements` 
myvector[3]; // gets the 4th element in the vector 
2

Oto get() funkcja, która zwraca _i th Student w _list.

Student get(list<Student> _list, int _i){ 
    list<Student>::iterator it = _list.begin(); 
    for(int i=0; i<_i; i++){ 
     ++it; 
    } 
    return *it; 
} 
Powiązane problemy