10
votes

Comprendre les itérateurs dans la STL

Quels sont exactement les itérateurs dans le C ++ STL?

Dans mon cas, j'utilise une liste , et je ne comprends pas pourquoi vous devez faire un itérateur std :: Liste :: const_iterator ielementlocator; < / Code> Pour afficher le contenu de la liste par l'opérateur Derefrence:
COUT << * IELEMENTLOCATOR; Après l'avoir attribué à peut-être list.begin () .

S'il vous plaît expliquer quel est exactement un itérateur et pourquoi je dois la désirer ou l'utiliser.


0 commentaires

6 Réponses :


-1
votes

Il existe déjà beaucoup de bonnes explications d'itérateurs. Juste google it.

Un exemple .

S'il y a quelque chose de spécifique, vous ne comprenez pas le retour et demander.


1 commentaires

Les questions de dépassement de pile deviennent souvent le meilleur coup sur Google, à quel point répond aux réponses "Pourquoi ne faites-vous pas que Google il" a l'air plutôt abrégé. meta.stackexchange.com/questions/5280/embrace-the- Non-Google Rs



7
votes

Je suis paresseux. Je ne voudrais donc pas décrire ce qu'est un itérateur et comment ils sont utilisés, surtout quand il y a déjà beaucoup d'articles en ligne que vous pouvez vous lire vous-même.

Voici quelques-uns que je peux citer pour un démarrage, faire la réalisation des liens vers des articles complètes:

MSDN dit, < / p>

Itérateurs sont une généralisation de les pointeurs, abstraction de leur exigences d'une manière qui permet un Programme C ++ pour travailler avec différents structures de données de manière uniforme . Les itérateurs agissent en tant qu'intermédiaires entre les conteneurs et le générique algorithmes. Au lieu de fonctionner sur types de données spécifiques, algorithmes sont défini pour fonctionner sur une plage spécifié par un type d'itérateur. Tout Structure de données qui satisfait à la Les exigences de l'itérateur peuvent alors alors être exploité par l'algorithme. Là sont cinq types ou catégories de Itérateur [...]

Au fait, il semble que le MSDN ait pris le texte en gras à partir de la norme C ++ elle-même, en particulier de la section §24.1 / 1 qui dit

Itérateurs sont une généralisation de des pointeurs qui permettent un programme C ++ de Travailler avec différentes structures de données (conteneurs) de manière uniforme. à être capable de construire un modèle algorithmes qui fonctionnent correctement et efficacement sur différents types de données structures, la bibliothèque formalise non juste les interfaces mais aussi la Semantiques et hypothèses de complexité d'itérateurs. Tous les itérateurs je supporte l'expression * i, entraînant un valeur de certaines classes, énumération ou Type Intégré T, appelé Type de valeur de l'itérateur. Tous les Itérateurs I pour que l'expression (* i) .m est Bien défini, soutenez l'expression i-> m avec la même sémantique que (*je suis. Pour chaque itérateur type x pour quelle égalité est définie, il y a un type intégral signé correspondant appelé le type de différence de la Itérateur.

Cplusplus dit,

en C ++, un itérateur est n'importe quel objet cela, pointant vers un élément dans un gamme d'éléments (tels qu'un tableau ou un conteneur), a la capacité de itérer à travers les éléments de cette gamme à l'aide d'un ensemble d'opérateurs (à moins, l'incrément (++) et Dréréférence (*) opérateurs).

La forme la plus évidente d'itérateur est un Pointeur [...]

Et vous pouvez également lire ceci:


0 commentaires

-1
votes

Je suggérerais de lire sur la surcharge de l'opérateur en C ++. Cela indiquera pourquoi * et -> peut dire essentiellement n'importe quoi. Ce n'est qu'alors que vous devriez lire sur les itérateurs. Sinon, cela pourrait sembler très déroutant.


0 commentaires

2
votes

Un itérateur est à un conteneur STL à quel point un pointeur est à un tableau. Vous pouvez penser à eux comme des objets de pointeur aux conteneurs STL. En tant que pointeurs, vous pourrez les utiliser avec la notation du pointeur (E.G. * ielementlocator , ielementLocator ++ ). En tant qu'objets, ils auront leurs propres attributs et méthodes (http://www.cplusplus.com/reference/std/itéator).


0 commentaires

3
votes

Un itérateur n'est pas le même que le conteneur lui-même. L'itérateur fait référence à un seul élément du conteneur, ainsi que de fournir des moyens d'atteindre d'autres éléments.

envisager de concevoir votre propre conteneur sans itérateurs. Il pourrait avoir une fonction code> taille code> pour obtenir le nombre d'éléments qu'il contient et pourrait surcharger l'opérateur [] code> pour vous permettre d'obtenir ou de définir un élément par sa position.

mais "accès aléatoire" de ce type n'est pas facile à mettre en œuvre efficacement sur certaines types de conteneur. Si vous obtenez le millionième élément: c [1000000] code> et le conteneur utilise en interne une liste liée, il devra numériser par un million d'éléments pour trouver celui que vous souhaitez. P>

Vous pouvez plutôt décider de permettre à la collection de se souvenir d'un élément "actuel". Il pourrait avoir des fonctions telles que Démarrer code> et plus code> et suivez code> pour vous permettre de boucler via le contenu: p> xxx Pré>

Mais cela met l'état de "état d'itération" à l'intérieur du conteneur. C'est une grave limitation. Et si vous vouliez comparer chaque article dans le conteneur avec tous les autres éléments? Cela nécessite deux boucles imbriquées, les deux itérant à travers tous les articles. Si le conteneur lui-même stocke la position de l'itération, vous n'avez aucun moyen de nier deux de telles itérations - la boucle interne détruira le fonctionnement de la boucle extérieure. P>

Donc, des itérateurs sont une copie indépendante d'un état d'itération . Vous pouvez commencer une itération: p> xxx pré>

que itérateur, i code> est un objet distinct qui représente une position dans le conteneur. Vous pouvez chercher tout ce qui est stocké à cette position: p> xxx pré>

Vous pouvez passer à l'élément suivant: p> xxx pré>

avec certains Itérateurs, vous pouvez ignorer plusieurs éléments: p> xxx pré>

ou obtenir un élément à une position à une position par rapport à la position identifiée par l'itérateur: p>

while (i != c.end())


0 commentaires

24
votes

Il y a trois blocs de construction dans la STL:

  • CONTENANTS
  • ALGORITHMES
  • Itérateurs

    aux conteneurs conceptuels contient des données. Cela n'est pas très utile, car vous voulez faire quelque chose avec les données; Vous voulez utiliser dessus, le manipuler, l'interroger, jouer avec elle. Les algorithmes font exactement cela. Mais les algorithmes ne sont pas Tenir Data, ils n'ont pas de données - ils ont besoin d'un conteneur pour cette tâche. Donnez un conteneur à un algorithme et vous avez une action en cours.

    Le seul problème à résoudre est comment un algorithme traverse un conteneur, d'un point de vue technique. Techniquement, un conteneur peut être une liste liée ou une arrache ou une arborescence binaire, ou toute autre structure de données pouvant contenir des données. Mais traverser un tableau est fait différemment de traverser un arbre binaire. Même si conceptuellement, tous un algorithme veut être "Obtenir" un élément à la fois d'un conteneur, puis travailler sur cet élément, le fonctionnement de obtenir l'élément suivant d'un conteneur est techniquement très conteneur- spécifique.

    Il apparaît comme si vous aviez besoin d'écrire le même algorithme pour chaque conteneur, de sorte que chaque version de l'algorithme a le code correct pour traverser le conteneur. Mais il y a une meilleure solution: Demandez au conteneur de renvoyer un objet pouvant traverser le conteneur. L'objet aurait un algorithme d'interface sache. Lorsqu'un algorithme demande à l'objet de "obtenir l'élément suivant", l'objet serait conforme. Étant donné que l'objet est venu directement du conteneur, il sait accéder aux données du conteneur. Et comme l'objet a une interface, l'algorithme sait, nous n'avons pas besoin de dupliquer un algorithme pour chaque conteneur.

    C'est l'itérateur.

    L'itérateur ici colle L'algorithme du conteneur, sans coupler les deux. Un itérateur est couplé à un conteneur et un algorithme est couplé à l'interface de l'itérateur. La source de la magie ici est vraiment une programmation de modèles. Considérez la norme copie () algorithme: xxx

    la copie copie () algorithme prend comme paramètre deux itérateurs modèles sur le Tapez dans et un itérateur de type out . Il copie les éléments commençant par la position d'abord et finissant juste avant la position Dernier , dans res . L'algorithme sait que pour obtenir l'élément suivant qu'il doit dire ++ d'abord ou ++ res . Il sait que lire un élément, il doit dire x = * premier et pour écrire un élément qu'il doit dire * res = x . Cela fait partie des algorithmes d'interface supposons que les itérateurs s'engagent. Si par erreur, un itérateur ne se conforme pas à l'interface, le compilateur émettrait une erreur pour appeler une fonction sur le type dans ou out , lorsque le type ne définit pas la fonction.


1 commentaires

Probablement l'un des meilleurs moyens de décrire la STL à un niveau élevé, merci!