Quels sont exactement les itérateurs dans le C ++ STL? P>
Dans mon cas, j'utilise une liste S'il vous plaît expliquer quel est exactement un itérateur et pourquoi je dois la désirer ou l'utiliser. P> code>, et je ne comprends pas pourquoi vous devez faire un itérateur
std :: Liste
COUT << * IELEMENTLOCATOR; CODE> Après l'avoir attribué à peut-être
list.begin () code>. P>
6 Réponses :
Il existe déjà beaucoup de bonnes explications d'itérateurs. Juste google it. P>
Un exemple . P>
S'il y a quelque chose de spécifique, vous ne comprenez pas le retour et demander. p>
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
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. P>
Voici quelques-uns que je peux citer pour un démarrage, faire la réalisation des liens vers des articles complètes: P>
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 forte>. 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 [...] P> blockQuote>
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 p>
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. fort> à ê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. P> blockQuote>
Cplusplus dit, P>
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). P>
La forme la plus évidente d'itérateur est un Pointeur [...] P> blockQuote>
Et vous pouvez également lire ceci: p>
- Qu'est-ce que c'est un itérateur? li>
- itérateurs de la bibliothèque C ++ standard li>
- itérateur (à l'entrée wiki) li> ul>
avoir de la patience et lisez tous ceux-ci. Espérons que vous aurez une idée de ce qu'un itérateur est, en C ++. L'apprentissage C ++ nécessite de la patience et du temps. p>
Je suggérerais de lire sur la surcharge de l'opérateur en C ++. Cela indiquera pourquoi * code> et
-> code> 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. P>
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 code>,
ielementLocator ++ code>). En tant qu'objets, ils auront leurs propres attributs et méthodes (http://www.cplusplus.com/reference/std/itéator). P>
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 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: 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 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> que itérateur, Vous pouvez passer à l'élément suivant: p> avec certains Itérateurs, vous pouvez ignorer plusieurs éléments: p> ou obtenir un élément à une position à une position par rapport à la position identifiée par l'itérateur: p> [] code> pour vous permettre d'obtenir ou de définir un élément par sa position.
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>
Démarrer code> et
plus code> et
suivez code> pour vous permettre de boucler via le contenu: p>
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>
while (i != c.end())
Il y a trois blocs de construction dans la STL:
aux conteneurs conceptuels contient des données. Cela n'est pas très utile, car vous voulez 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 fort> l'élément suivant d'un conteneur est techniquement très conteneur- spécifique. P> 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. P> C'est l'itérateur. P> L'itérateur ici colle forte > 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 la copie copie () code> algorithme: p>
copie () code> algorithme prend comme paramètre deux itérateurs modèles sur le Tapez
dans code> et un itérateur de type
out code>. Il copie les éléments commençant par la position
d'abord code> et finissant juste avant la position
Dernier code>, dans
res code>. L'algorithme sait que pour obtenir l'élément suivant qu'il doit dire
++ d'abord code> ou
++ res code>. Il sait que lire un élément, il doit dire
x = * premier code> et pour écrire un élément qu'il doit dire
* res = x code>. 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 code> ou
out code>, lorsque le type ne définit pas la fonction. p> p>
Probablement l'un des meilleurs moyens de décrire la STL à un niveau élevé, merci!