O objetivo é acessar o "enésimo" elemento de um vetor de strings em vez do operador [] ou do método "at". Pelo que entendi, os iteradores podem ser usados para navegar por contêineres, mas nunca usei iteradores antes, e o que estou lendo é confuso.
Se alguém pudesse me dar algumas informações sobre como conseguir isso, eu agradeceria. Obrigado.
Respostas:
Você precisa usar o método
begin
eend
davector
classe, que retorna o iterador referindo-se ao primeiro e ao último elemento respectivamente.fonte
std::vector
tem iteradores de acesso aleatório.std::advance(it, n)
. Ele é definido para fazer exatamente o que você deseja e será usado automaticamenteit + n
se o iterador estiver marcado como acesso aleatório, ou fará o loop se for necessário.Normalmente, os iteradores são usados para acessar elementos de um contêiner de maneira linear; entretanto, com "iteradores de acesso aleatório", é possível acessar qualquer elemento da mesma maneira que
operator[]
.Para acessar elementos arbitrários em um vetor
vec
, você pode usar o seguinte:A seguir está um exemplo de um padrão de acesso típico (versões anteriores de C ++):
A vantagem de usar o iterador é que você pode aplicar o mesmo padrão a outros contêineres :
Por esse motivo, é realmente fácil criar um código de modelo que funcione da mesma forma, independentemente do tipo de contêiner . Outra vantagem dos iteradores é que ele não assume que os dados residem na memória; por exemplo, pode-se criar um iterador direto que pode ler dados de um fluxo de entrada ou que simplesmente gera dados em tempo real (por exemplo, um intervalo ou gerador de números aleatórios).
Outra opção usando
std::for_each
e lambdas:Desde C ++ 11, você pode usar
auto
para evitar a especificação de um nome de tipo muito longo e complicado do iterador como visto antes (ou ainda mais complexo):E, além disso, há uma variante mais simples para cada:
E, finalmente, há também
std::accumulate
onde você deve ter cuidado ao adicionar números inteiros ou números de ponto flutuante.fonte
Em C ++ - 11, você pode fazer:
Veja aqui as variações: https://en.cppreference.com/w/cpp/language/range-for
fonte
7.5.0
no Ubuntu 18.04 e funciona para array da mesma maneira.Os iteradores do Vector são iteradores de acesso aleatório, o que significa que eles se parecem e funcionam como ponteiros simples.
Você pode acessar o enésimo elemento adicionando n ao iterador retornado do
begin()
método do contêiner ou pode usar o operador[]
.Alternativamente, você pode usar a função de avanço que funciona com todos os tipos de iteradores. (Você teria que considerar se realmente deseja realizar "acesso aleatório" com iteradores de acesso não aleatório, já que isso pode ser uma coisa cara de se fazer.)
fonte
advance
para iteradores de acesso aleatório ou iteradores de categoria desconhecida, uma vez que é garantido que funcione em tempo constante nesse caso. É por isso que os iteradores definidos pelo usuário devem ser marcados corretamente.advance
é realmente irritante de usar (por causa do uso do parâmetro out) se você sabe que está lidando com iteradores de acesso aleatório. Só recomendaria em código genérico, e se não fosse muito usado (se o algoritmo não suportar bem iteradores de acesso não aleatório, que seja - por exemplo,std::sort
poderia classificar um,std::list
mas não porque seria ridiculamente ineficiente )operator+
. Mas a pergunta era explicitamente sobre vetor, então não há nada de errado com a primeira parte de sua resposta. Eu apenas pensei que a segunda parte poderia implicar "você não pode usar o advance com iteradores de acesso aleatório, mesmo se quiser" para alguém que nunca viuadvance
antes.Vector
deve ser minúsculaAqui está um exemplo de acesso ao
ith
índice de astd::vector
usando umstd::iterator
dentro de um loop que não requer o incremento de dois iteradores.Sem for-loop
e usando o
at
método:fonte