Jeśli często potrzebujesz dostępu do n-tego elementu sekwencji, std::listktóry jest zaimplementowany jako lista podwójnie połączona, prawdopodobnie nie jest to właściwy wybór. std::vectorlub std::dequeprawdopodobnie 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::advancewywoł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::nextskutecznie opakowuje wywołanie do std::advance, ułatwiając przesunięcie Nczasu iteratora z mniejszą liczbą wierszy kodu i mniejszą liczbą zmiennych podlegających mutacji. std::nextzostał dodany w C ++ 11.
vectorzamiast tego?