Itérateurs de vecteur C ++

Itérateurs de vecteur C ++
Les principaux itérateurs en C ++ sont l'itérateur d'entrée, l'itérateur de sortie, l'itérateur vers l'avant, l'itérateur bidirectionnel et l'itérateur d'accès aléatoire. L'itérateur inversé n'est pas vraiment un itérateur; c'est un adaptateur itérateur. Il y a quelques variantes pour les itérateurs, comme un itérateur constant.

Un itérateur est un pointeur élaboré. Comme un pointeur, il pointe vers des objets du même type en mémoire à différents moments. Tous les itérateurs sont dérécibles, à l'exception de l'itérateur de sortie qui est déréablesnable uniquement pour un ensemble de types. Dererenciable signifie que la valeur pointée par le pointeur ou l'itérateur peut être obtenue en utilisant l'opérateur d'indirection * *. Un entier peut être ajouté à certains itérateurs de la même manière, et dans le même but, l'entier serait ajouté à un pointeur.

Les questions de cet article sont: quels sont ces itérateurs? Lequel de ces itérateurs est utilisé avec le vecteur C ++? Comment ces itérateurs sont-ils utilisés avec le vecteur C ++? Cet article répond à toutes ces questions de manière simplifiée. À la fin de cet article, lorsque toutes ces questions auraient été répondues, les itérateurs vectoriels C ++ seront intuitifs et naturels (pour le lecteur).

Contenu de l'article

  • Résumé des itérateurs C ++
  • Construction et accès vectoriel
  • Accès à la gamme
  • Insérer les itérateurs
  • Déplacer itérateur
  • Conclusion

Résumé des itérateurs C ++

Itérateur d'entrée

L'idée de l'itérateur d'entrée est pour un programme de recevoir une valeur d'entrée. Contrairement à l'itérateur de sortie, l'itérateur d'entrée est toujours dérécisable. Pour deux itérateurs d'entrée, A et B, «a == b» n'implique pas «++ a == ++ b».

Itérateur de sortie
L'idée de l'itérateur de sortie est pour un programme pour libérer la valeur de sortie. Contrairement à l'itérateur d'entrée, l'itérateur de sortie n'est pas toujours déréciviable. Il n'est pas perméable uniquement pour un ensemble de types.

Itérateur avant
L'itérateur avant peut scanner le vecteur du début à la fin, un par un (incréments). Il a toutes les exigences de l'itérateur d'entrée, ainsi que des exigences supplémentaires. Il peut remplacer un itérateur d'entrée. Pour deux itérateurs en avant, A et B, «A == B» implique «++ a == ++ b».

Itérateur bidirectionnel
L'itérateur bidirectionnel peut scanner le vecteur du début à la fin, un par un. De la fin au début, un par un (décrémentant). Il a toutes les exigences de l'itérateur avant, ainsi que des exigences supplémentaires. Il peut remplacer un itérateur avant. Pour deux itérateurs bidirectionnels, A et B,

«A == B» implique «++ a == ++ b»
et
«-A == -b» implique «a == b».

Itérateur d'accès aléatoire

L'itérateur d'accès aléatoire a toutes les exigences de l'itérateur bidirectionnel, ainsi que des exigences supplémentaires. Il peut remplacer un itérateur bidirectionnel. L'Itérateur d'accès aléatoire s'accompagne de l'avantage que s'il pointe actuellement vers le premier élément et que le quatrième élément est nécessaire, il sauterait les deuxième et troisième éléments et pointer vers le quatrième élément. Le saut inversé vers le bas est vrai.

Itérateur inversé

Notez que C ++ n'a pas d'itérateur inversé normal car il a un itérateur avant. Il y a donc un adaptateur appelé un itérateur inversé. Il y a plus de bonnes nouvelles: l'itérateur inversé répond à toutes les exigences d'un itérateur bidirectionnel.

Itérateur constant

Si un itérateur est dit être un itérateur, l'élément auquel il pointe ne peut pas être modifié.

Construction et accès vectoriel

Les conteneurs en C ++ sont: Class Array, Deque, Forward_List, List, Vector, Map, Set, Unordred_map et Unordred_set. Le vecteur est un conteneur. Certains modèles de fonction dans la bibliothèque standard C ++ fonctionnent avec les itérateurs directement ou indirectement. Les conteneurs C ++, ainsi que le vecteur, utilisent ces fonctions. Ces fonctions peuvent être mises à la disposition du programme C ++ avec l'une des directives d'inclusion suivantes:

#inclure

ou

#inclure

L'inclusion de l'un des autres conteneurs mettra également à disposition ces modèles de fonction. Un modèle de fonction est destiné à une fonction qui peut fonctionner avec différents types de données. Le vecteur utilise des itérateurs via ces modèles de fonction. Certains des modèles de fonction et leur relation avec le vecteur sont les suivants:

Construction

Fonction du modèle:

modèle Consxpr Auto Data (C&C) -> DecType (C.données());

Auto signifie que le type de retour est déterminé lors de l'évaluation de la fonction. C est l'objet de la classe C.

Un exemple d'objet vectoriel construit avec cela implicitement est:

vecteur Vtr;

Ici, l'objet, C, est vide.

Fonction du modèle:

modèle Consxpr Const e * data (initializer_list il) noexcept;

Ici, E * est un itérateur qui pointe vers le premier élément de la liste ou du conteneur. Son utilisation avec le vecteur implicitement, serait avec:

vecteur vtr 'a', 'b', 'c', 'd', 'e';
vecteur:: const_iterator it = vtr.commencer();

La fonction de modèle est plus applicable à l'instruction début () (la deuxième instruction).

Accès

Fonction du modèle:

modèle Consxpr Auto Size (const C & C) -> DecType (C.taille());

Cela renvoie la taille du conteneur. Exemple vecteur:

vecteur vtr 'a', 'b', 'c', 'd', 'e';
int n = vtr.taille();
couter << N << endl;

La sortie est 5.

Fonction du modèle:

modèle [[Nodiscard]] constexpr bool vide (initializer_list il) noexcept;

Renvoie True si la liste est vide ou fausse sinon. Exemple vecteur:

vecteur vtr 'a', 'b', 'c', 'd', 'e';
bool bl = vtr.vide();
couter << bl << endl;

La sortie est 0 pour false.

Accès à la gamme

Il existe d'autres fonctions de modèle qui utilisent des itérateurs que le vecteur utilise pour ses problèmes de plage. Une gamme est un ensemble consécutif d'éléments de conteneurs.

Fonction du modèle:

modèle Consxpr Auto Begin (C&C) -> DecType (C.commencer());

Cela renvoie un itérateur pointant vers le premier élément de la liste. Auto ici signifie, la valeur de retour est déterminée lors de l'évaluation. Exemple pour vecteur:

vecteur vtr 'a', 'b', 'c', 'd', 'e';
vecteur:: iterator it = vtr.commencer();
couter << *it << '\n';

La sortie est un. L'itérateur renvoyé ici est un itérateur d'accès aléatoire. Un itérateur d'accès aléatoire constant aurait pu être retourné - voir plus tard.

Modèle de fonction:

modèle Consxpr Auto End (const C & C) -> DecType (C.fin());

Renvoie un itérateur constant pointant vers le dernier élément de la liste. Code vectoriel:

vecteur vtr 'a', 'b', 'c', 'd', 'e';
vecteur:: const_iterator it = vtr.fin();
--il;
couter << *it << ";
--il;
couter << *it << endl;

La sortie est «e d». Un itérateur constant peut être incrémenté ou décrémenté, mais la valeur à laquelle il pointe ne peut pas être modifiée. Un itérateur d'accès aléatoire normal aurait pu être retourné - voir plus tard.

Modèle de fonction:

modèle constexpr reverse_iterator RBEGIN (initialiseur_list il);

Renvoie la dernière valeur de la liste. rbegin () pointe vers le dernier élément de la liste et pas au-delà du dernier élément de la liste, comme fin (). Exemple vecteur:

vecteur vtr 'a', 'b', 'c', 'd', 'e';
vecteur:: reverse_iterator it = vtr.rbegin ();
couter << *it << ";
++il;
couter << *it << endl;

La sortie est: e d. Avec l'itérateur inversé, ++ a l'effet inverse pour l'itérateur bidirectionnel.

Modèle de fonction:

modèle constexpr reverse_iterator Rend (initializer_list il);

Points juste avant le premier élément de la liste. Exemple vecteur:

vecteur vtr 'a', 'b', 'c', 'd', 'e';
vecteur:: reverse_iterator it = vtr.déchirer();
--il;
couter << *it << ";
--il;
couter << *it << endl;

La sortie est un B. Avec l'itérateur inversé, - a l'effet inverse pour ++ de l'itérateur bidirectionnel.

Il existe d'autres fonctions de modèle sous cette rubrique - voir plus tard.

Insérer les itérateurs

Reverse_iterator est un adaptateur itérateur, pas vraiment un itérateur. L'itérateur d'insert est également un adaptateur itérateur. Il satisfait toutes les exigences de l'itérateur de sortie, ainsi que ses propres exigences. Il existe sous trois formes en C ++: le back_inserter, le front_inserter et l'inserter. Chacun d'eux a son propre constructeur.

back_inserter:

Insère à l'arrière!
Prototypes importants:

Explicit back_insert_iterator (conteneur & x);
back_insert_iterator & operator = (TynEname Container :: value_type && value);

Exemple vecteur:
Le vecteur n'a pas de fonction d'émmense insert qui se insère à l'arrière. Cependant, la fonction membre Push_Back (T) peut être vue comme celle-ci.

front_inserter

Inserts à l'avant!
Prototypes importants:

explicite front_insert_iterator (conteneur & x);
front_insert_iterator & operator = (TynEname Container :: value_type && value);

Exemple vecteur:
Le vecteur n'a pas de fonction de membre d'insertion qui s'insère à l'avant. Le vecteur n'a pas non plus la fonction de membre PUSH_FRONT (T).

La bonne nouvelle est que le vecteur a des fonctions de membre insérer qui peuvent insérer n'importe où, au début, à l'intérieur ou à la fin du vecteur.

inserter

Cet itérateur insérait au début, à l'intérieur ou à la fin du vecteur.

Prototypes importants:

insert_iterator (Container & X, TynEname Container :: Iterator I);
insert_iterator & operator = (TynEname Container :: value_type && value);

Exemple vecteur:

vecteur vtr 'a', 'b', 'c', 'd', 'e';
vecteur:: iterator it = vtr.commencer();
it = it + 2;
vtr.insérer (it, 'c');
pour (int i = 0; icouter << vtr[i] << ", ";
couter <

La sortie est:

A, B, C, C, D, E,

L'expression de l'insert du vecteur est:

vtr.insérer (it, 'c');

Il insère l'élément juste avant le pointeur (il) il pointe vers.

Déplacer itérateur

Le move_iterator est également un adaptateur itérateur. Le programme suivant est similaire à l'exemple qui figure dans la spécification C ++:

#inclure
#inclure
#inclure
Utilisation de Namespace Std;
int main()

liste chs 'a', 'b', 'c', 'd', 'e';
vecteur VTR (Make_move_iterator (CHS.begin ()), make_move_iterator (chs.fin()));
couter << "Original list Content:" << endl;
pour (auto it = chs.commencer(); il != chs.fin(); it ++)
couter << *it << ", ";
couter << endl << endl;
couter << "Vector Content:" << endl;
pour (int i = 0; icouter << vtr[i] << ", ";
couter << endl;
retour 0;

La sortie est:

Contenu de la liste originale:
A, B, C, D, E,

Contenu vectoriel:
A, B, C, D, E,

Cet itérateur convertit une valeur de source en une valeur avant de la placer à destination.

Conclusion

Les principaux itérateurs en C ++ sont l'itérateur d'entrée, l'itérateur de sortie, l'itérateur avant, l'itérateur bidirectionnel et l'itérateur à accès aléatoire. La bibliothèque standard C ++ dispose de certains modèles de fonction qui utilisent ces itérateurs. Le vecteur utilise ces itérateurs via les modèles de fonction. Le vecteur a des noms différents pour certains de ces itérateurs. Il existe également des adaptateurs itérateurs, qui sont: Reverse_iterator, iterator adaptateur et Move_iterator. Certaines variantes d'itérateurs existent également. Il suffit d'inclure dans un programme pour avoir toutes ces fonctionnalités. Après avoir compris le rôle de ces itérateurs, adaptateurs et modèles de fonction qui les utilisent, l'utilisation des itérateurs avec des vecteurs devient intuitif.