Se você freqüentemente precisa acessar o enésimo elemento de uma sequência, std::list
que é implementado como uma lista duplamente vinculada, provavelmente não é a escolha certa. std::vector
ou std::deque
provavelmente seria melhor.
Dito isso, você pode obter um iterador para o enésimo elemento usando 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'
}
Para um contêiner que não fornece acesso aleatório, como std::list
, std::advance
chamadas operator++
nos N
tempos do iterador . Alternativamente, se sua implementação de biblioteca padrão fornecer, você pode chamar std::next
:
if (l.size() > N)
{
std::list<Object>::iterator it = std::next(l.begin(), N);
}
std::next
é efetivamente encapsula uma chamada para std::advance
, tornando mais fácil avançar os N
tempos de um iterador com menos linhas de código e menos variáveis mutáveis. std::next
foi adicionado em C ++ 11.
vector
?