Если вам часто требуется доступ к N-му элементу последовательности, std::list
который реализован как двусвязный список, вероятно, это неправильный выбор. std::vector
или std::deque
, вероятно, было бы лучше.
Тем не менее, вы можете получить итератор для N-го элемента, используя std::advance
:
std::list<Object> l;
unsigned N = ;
if (l.size() > N)
{
std::list<Object>::iterator it = l.begin();
std::advance(it, N);
}
Для контейнера, который не предоставляет произвольный доступ, например std::list
, std::advance
вызывает operator++
время итератора N
. В качестве альтернативы, если ваша реализация стандартной библиотеки предоставляет это, вы можете вызвать std::next
:
if (l.size() > N)
{
std::list<Object>::iterator it = std::next(l.begin(), N);
}
std::next
эффективно обертывает вызов std::advance
, облегчая продвижение N
времени итератора с меньшим количеством строк кода и меньшим количеством изменяемых переменных. std::next
был добавлен в C ++ 11.
vector
вместо этого?