Więc mam listę:
list<Object> myList;
myList.push_back(Object myObject);
Nie jestem pewien, ale jestem pewien, że byłby to „zerowy” element w tablicy. Czy jest jakaś funkcja, której mogę użyć, która zwróci wartość „myObject”?
Object copy = myList.find_element(0);
?
vector
zamiast tego?front()
.Odpowiedzi:
Jeśli często potrzebujesz dostępu do n-tego elementu sekwencji,
std::list
który jest zaimplementowany jako lista podwójnie połączona, prawdopodobnie nie jest to właściwy wybór.std::vector
lubstd::deque
prawdopodobnie byłoby lepiej.To powiedziawszy, możesz uzyskać iterator do N-tego elementu za pomocą
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' }
W przypadku kontenera, który nie zapewnia dostępu swobodnego, na przykład
std::list
,std::advance
wywołuje czasyoperator++
iteratoraN
. Alternatywnie, jeśli zapewnia to implementacja biblioteki standardowej, możesz zadzwonić pod numerstd::next
:if (l.size() > N) { std::list<Object>::iterator it = std::next(l.begin(), N); }
std::next
skutecznie opakowuje wywołanie dostd::advance
, ułatwiając przesunięcieN
czasu iteratora z mniejszą liczbą wierszy kodu i mniejszą liczbą zmiennych podlegających mutacji.std::next
został dodany w C ++ 11.źródło
std::advance
lubstd::next
, łatwo jest wywołać UB. Nie ma sprawdzania granic.std::list
nie zapewnia żadnej funkcji do pobrania elementu o podanym indeksie. Możesz spróbować go zdobyć, pisząc jakiś kod, którego nie polecam, ponieważ byłoby to nieefektywne, gdybyś musiał to często robić.Co potrzebne jest:
std::vector
. Użyj go jako:std::vector<Object> objects; objects.push_back(myObject); Object const & x = objects[0]; //index isn't checked Object const & y = objects.at(0); //index is checked
źródło
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 }
źródło
Może nie jest to najbardziej efektywny sposób. Ale możesz przekonwertować listę na wektor.
#include <list> #include <vector> list<Object> myList; vector<Object> myVector(myList.begin(), myList.end());
Następnie uzyskaj dostęp do wektora za pomocą operatora [x].
auto x = MyVector[0];
Możesz umieścić to w funkcji pomocniczej:
#include <memory> #include <vector> #include <list> template<class T> shared_ptr<vector<T>> ListToVector(list<T> List) { shared_ptr<vector<T>> Vector { new vector<string>(List.begin(), List.end()) } return Vector; }
Następnie użyj funkcji pomocniczej w następujący sposób:
auto MyVector = ListToVector(Object); auto x = MyVector[0];
źródło