Um iterador é um ponteiro elaborado. Como um ponteiro, aponta para objetos do mesmo tipo na memória em momentos diferentes. Todos os iteradores são dereferenciais, exceto o iterador de saída que é dereferenciável apenas para um conjunto de tipos. Dereferenceable significa que o valor apontado pelo ponteiro ou iterador pode ser obtido usando o operador indiretivo, *. Um número inteiro pode ser adicionado a alguns iteradores da mesma maneira e, para o mesmo propósito, o número inteiro seria adicionado a um ponteiro.
As perguntas para este artigo são: O que são esses iteradores? Qual desses iteradores é usado com o vetor C ++? Como esses iteradores são usados com o vetor C ++? Este artigo responde a todas essas perguntas de uma maneira simplificada. No final deste artigo, quando todas essas perguntas teriam sido respondidas, os iteradores do vetor C ++ serão intuitivos e naturais (para o leitor).
Conteúdo do artigo
Resumo dos Iteradores C ++
Iterador de entrada
A idéia de iterador de entrada é para um programa receber o valor de entrada. Ao contrário do iterador de saída, o iterador de entrada é sempre desreferente. Para dois iteradores de entrada, A e B, "A == B" não implica "++ a == ++ b".
Iterador de saída
A idéia de iterador de saída é para um programa liberar valor de saída. Ao contrário do iterador de entrada, o iterador de saída nem sempre é desreferente. É dereferenciável apenas para um conjunto de tipos.
Forward ITERator
O iterador avançado pode escanear o vetor desde o início ao final, um por um (incrementando). Possui todos os requisitos do iterador de entrada, além de requisitos adicionais. Pode substituir um iterador de entrada. Para dois iteradores avançados, A e B, "A == B" implica "++ a == ++ b".
Iterador bidirecional
O iterador bidirecional pode escanear o vetor do início ao fim, um por um. Do final ao início, um por um (decrementando). Possui todos os requisitos do iterador avançado, além de requisitos adicionais. Pode substituir um iterador para a frente. Para dois iteradores bidirecionais, A e B,
"A == b" implica "++ a == ++ b"
e
"-A == -b" implica "a == b".
Itorator de acesso aleatório
O iterador de acesso aleatório tem todos os requisitos do iterador bidirecional, além de requisitos adicionais. Pode substituir um iterador bidirecional. O iterador de acesso aleatório vem com a vantagem de que, se estiver apontando para o primeiro elemento e o quarto elemento é necessário, ele pularia o segundo e o terceiro elementos e apontaria para o quarto elemento. O pular reverso para baixo é verdadeiro.
Iterador reverso
Observe que o C ++ não tem um iterador reverso normal, pois possui um iterador para a frente. Então, há um adaptador chamado de itera reversa. Há mais boas notícias: o iterador reverso atende a todos os requisitos de um iterador bidirecional.
Iterador constante
Se um iterador é considerado um iterador constante, o elemento que aponta para não pode ser modificado.
Construção e acesso a vetores
Os contêineres em C ++ são: Classe Array, Deque, Forward_list, Lista, Vector, Mapa, Definir, UNODERED_MAP e UNODERED_SET. O vetor é um contêiner. Certos modelos de função na biblioteca padrão C ++ operam com iteradores direta ou indiretamente. Contêineres C ++, assim como o vetor, usam essas funções. Essas funções podem ser disponibilizadas para o programa C ++ com uma das seguintes diretivas de inclusão:
#incluir
ou
#incluir
A inclusão de qualquer um dos outros contêineres também disponibilizará esses modelos de função. Um modelo de função é para uma função que pode operar com diferentes tipos de dados. O vetor usa iteradores através desses modelos de função. Alguns dos modelos de função e seu relacionamento com o vetor são os seguintes:
Construção
Função de modelo:
modeloDados automáticos do Constexpr (C&C) -> Decttype (C.dados());
Auto significa que o tipo de retorno é determinado na avaliação da função. C é o objeto da classe C.
Um exemplo de um objeto vetorial construído com isso implicitamente é:
vetorvtr;
Aqui o objeto, C, está vazio.
Função de modelo:
modeloconstExpr const e* dados (Initializer_list il) noexcept;
Aqui, E* é um iterador que aponta para o primeiro elemento da lista ou contêiner. Seu uso com o vetor implicitamente seria com:
vetorvtr 'a', 'b', 'c', 'd', 'e';
vetor:: const_iterator it = vtr.começar();
A função de modelo é mais aplicável à instrução inicial () (a segunda declaração).
Acesso
Função de modelo:
modeloTamanho automático constExpr (const C&C) -> dTtype (C.tamanho());
Isso retorna o tamanho do contêiner. Exemplo de vetor:
vetorvtr 'a', 'b', 'c', 'd', 'e';
int n = vtr.tamanho();
cout << N << endl;
A saída é 5.
Função de modelo:
modelo[[Nodiscard]] Constexpr bool vazio (Initializer_list il) noexcept;
Retorna true se a lista estiver vazia ou falsa caso contrário. Exemplo de vetor:
vetorvtr 'a', 'b', 'c', 'd', 'e';
bool bl = vtr.vazio();
cout << bl << endl;
A saída é 0 para false.
Acesso à faixa
Existem outras funções de modelo, que usam iteradores que o vetor usa para seus problemas de alcance. Um intervalo é um conjunto consecutivo de elementos de contêiner.
Função de modelo:
modeloConstexpr Auto Begin (C & C) -> Decttype (C.começar());
Isso retorna um iterador apontando para o primeiro elemento da lista. Auto aqui significa que o valor de retorno é determinado na avaliação. Exemplo para vetor:
vetorvtr 'a', 'b', 'c', 'd', 'e';
vetor:: iterator it = vtr.começar();
cout << *it << '\n';
A saída é um. O iterador retornou aqui é um iterador de acesso aleatório. Um iterador de acesso aleatório constante poderia ter sido devolvido - veja mais tarde.
Modelo de função:
modeloConstExpr Auto End (const C&C) -> Decttype (C.fim());
Retorna um iterador constante apontando para o último elemento da lista. Código vetorial:
vetorvtr 'a', 'b', 'c', 'd', 'e';
vetor:: const_iterator it = vtr.fim();
--isto;
cout << *it << ";
--isto;
cout << *it << endl;
A saída é "e d". Um iterador constante pode ser incrementado ou decrescente, mas o valor que aponta para não pode ser alterado. Um iterador de acesso aleatório normal poderia ter sido devolvido - veja mais tarde.
Modelo de função:
modeloconstexpr reverse_iterator RBEGIN (Initializer_list il);
Retorna o último valor na lista. RBEGIN () aponta para o último elemento da lista e não além do último elemento da lista, como end (). Exemplo de vetor:
vetorvtr 'a', 'b', 'c', 'd', 'e';
vetor:: reverse_iterator it = vtr.rBegin ();
cout << *it << ";
++isto;
cout << *it << endl;
A saída é: e d. Com o iterador reverso, ++ tem o efeito oposto para o iterador bidirecional.
Modelo de função:
modeloconstexpr reverse_iterator rend (inicializer_list il);
Pontos pouco antes do primeiro elemento da lista. Exemplo de vetor:
vetorvtr 'a', 'b', 'c', 'd', 'e';
vetor:: reverse_iterator it = vtr.rend ();
--isto;
cout << *it << ";
--isto;
cout << *it << endl;
A saída é um B. Com o iterador reverso, - tem o efeito oposto para ++ do iterador bidirecional.
Existem outras funções de modelo neste título - veja mais tarde.
Insira iteradores
reverse_iterator é um adaptador de iterador, não é realmente um iterador. O iterador de inserção também é um adaptador de iterador. Ele satisfaz todos os requisitos do iterador de saída, além de seus próprios requisitos. Existe em três formas em C ++: o back_inserter, o Front_inserter e o Inserter. Cada um deles tem seu próprio construtor.
back_inserter:
Insere na parte de trás!
Protótipos importantes:
explícito back_insert_iterator (contêiner & x);
back_insert_iterator & operator = (contêiner de nome do tipo :: value_type && value);
Exemplo de vetor:
O vetor não tem nenhuma função de membro de inserção que insere na parte traseira. No entanto, a função de membro push_back (t) pode ser vista assim.
FRONT_INSERTER
Inserções na frente!
Protótipos importantes:
Front_insert_iterator explícito (contêiner & x);
FRONT_INSERT_ITERATOR & OPERATOR = (contêiner de nome :: value_type && value);
Exemplo de vetor:
O vetor não tem nenhuma função de membro de inserção que insere na frente. O vetor também não possui a função de membro push_front (t).
A boa notícia é que o vetor insere funções de membro que podem inserir em qualquer lugar, no começo, dentro ou no fim do vetor.
inserter
Este iterador inseriria no início, dentro ou no fim do vetor.
Protótipos importantes:
insert_iterator (contêiner & x, contêiner de tipo de tipo :: iterator i);
insert_iterator & operator = (contêiner de tipo de tipo :: value_type && value);
Exemplo de vetor:
vetorvtr 'a', 'b', 'c', 'd', 'e';
vetor:: iterator it = vtr.começar();
it = it + 2;
vtr.inserir (it, 'c');
para (int i = 0; icout << vtr[i] << ", ";
cout <A saída é:
A, B, C, C, D, E,A expressão de inserção do vetor é:
vtr.inserir (it, 'c');Ele insere o elemento pouco antes do ponteiro (ele) está apontando.
Mover iterador
O Move_Iterator também é um adaptador de iterador. O programa a seguir é semelhante ao exemplo que está na especificação C ++:
#incluir
#incluir
#incluir
usando namespace std;
int main ()
listachs 'a', 'b', 'c', 'd', 'e';
vetorvtr (make_move_iterator (chs.BEGIN ()), Make_move_iterator (CHS.fim()));
cout << "Original list Content:" << endl;
para (Auto It = CHS.começar(); isto != chs.fim(); IT ++)
cout << *it << ", ";
cout << endl << endl;
cout << "Vector Content:" << endl;
para (int i = 0; icout << vtr[i] << ", ";
cout << endl;
retornar 0;A saída é:
Conteúdo da lista original:
A, B, C, D, E,Conteúdo vetorial:
A, B, C, D, E,Este iterador converte um valor de origem em um Rvalue antes de colocá -lo no destino.
Conclusão
Os principais iteradores em C ++ são iterador de entrada, iterador de saída, iterador para frente, iterador bidirecional e iterador de acesso aleatório. A biblioteca padrão C ++ possui alguns modelos de função que usam esses iteradores. O vetor usa esses iteradores através dos modelos de função. O vetor tem alguns nomes diferentes para alguns desses iteradores. Existem também adaptadores de iterador, que são: reverse_iterator, adaptador de iterador e move_iterator. Algumas variantes de iteradores também existem. Basta incluir em um programa para ter todos esses recursos. Depois de entender o papel desses iteradores, adaptadores e modelos de função que os usam, o uso de iteradores com vetores se torna intuitivo.