Якщо вам часто потрібно отримати доступ до 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
було додано в С ++ 11.
vector
замість цього?