Ответ 1
Если вам часто необходим доступ к N-му элементу последовательности, std::list
, который реализуется как дважды связанный список, вероятно, не является правильным выбором. std::vector
или std::deque
, вероятно, будет лучше.
Тем не менее, вы можете получить итератор для элемента Nth, используя 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
был добавлен в С++ 11.