Как получить определенный элемент в списке, учитывая позицию?

Итак, у меня есть список:

list<Object> myList;
myList.push_back(Object myObject);

Я не уверен, но я уверен, что это будет "0-й" элемент в массиве. Есть ли какая-нибудь функция, которую я могу использовать, которая вернет "myObject"?

Object copy = myList.find_element(0);

?

Ответ 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.

Ответ 2

std::list не предоставляет никакой функции для получения элемента с индексом. Вы можете попытаться получить его, написав код, который я бы не рекомендовал, потому что это было бы неэффективно, если вам это часто нужно.

Что вам нужно: std::vector. Используйте его как:

std::vector<Object> objects;
objects.push_back(myObject);

Object obj = objects[0]; //get element given an index

Ответ 3

std::list<Object> l; 
std::list<Object>::iterator ptr;
int i;

for( i = 0 , ptr = l.begin() ; i < N && ptr != l.end() ; i++ , ptr++ );

if( ptr == l.end() ) {
    // list too short  
} else {
    // 'ptr' points to N-th element of list
}