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
lub std::deque
prawdopodobnie byłoby lepiej.
To powiedziawszy, możesz uzyskać iterator do N-tego elementu za pomocą std::advance
:
std::list<Object> l;
unsigned N = ;
if (l.size() > N)
{
std::list<Object>::iterator it = l.begin();
std::advance(it, N);
}
W przypadku kontenera, który nie zapewnia dostępu swobodnego, na przykład std::list
, std::advance
wywołuje czasy operator++
iteratora N
. Alternatywnie, jeśli zapewnia to implementacja biblioteki standardowej, możesz zadzwonić pod numer std::next
:
if (l.size() > N)
{
std::list<Object>::iterator it = std::next(l.begin(), N);
}
std::next
skutecznie opakowuje wywołanie do std::advance
, ułatwiając przesunięcie N
czasu iteratora z mniejszą liczbą wierszy kodu i mniejszą liczbą zmiennych podlegających mutacji. std::next
został dodany w C ++ 11.
vector
zamiast tego?