Если вам часто требуется доступ к N-му элементу последовательности, std::list
, который реализован в виде двусвязного списка, вероятно, не является правильным выбором. std::vector
или std::deque
, вероятно, будет лучше.
Тем не менее, вы можете получить итератор для N-го элемента, используя 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'
}
Для контейнера, который не обеспечивает произвольный доступ, например 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.