Question

Dans la STL presque tous les conteneurs ont une fonction d'effacement.La question que j'ai est un vecteur, l'effacement de la fonction retourne un itérateur pointant vers l'élément suivant dans le vecteur.La carte conteneur de ne pas faire cela.Au lieu de cela, il renvoie un void.Quelqu'un sait pourquoi il y a cette inconsistancy?

Était-ce utile?

La solution

Voir http://www.sgi.com/tech/stl/Map.html

La carte est la propriété la plus importante que l'insertion d'un nouvel élément dans une carte n'a pas pour effet d'invalider les itérateurs qui point aux éléments existants.L'effacement d'une élément à partir d'une carte aussi est-ce pas invalider les itérateurs, à l'exception, de bien sûr, pour les itérateurs qui en fait pointez sur l'élément qui est en cours de effacées.

La raison pour le retour d'un itérateur sur le bouton supprimer est de sorte que vous pouvez parcourir la liste de l'effacement d'éléments que vous allez.Si l'effacement d'un objet n'a pas d'invalider existant itérateurs il n'est pas nécessaire pour ce faire.

Autres conseils

erase retourne un iterator en C++11.Cela est dû à rapport de défaut 130:

Tableau 67 (23.1.1) dit que le conteneur::erase(iterator) retourne un itérateur.Tableau 69 (23.1.2) dit que, en plus de cette exigence, les conteneurs associatifs dire aussi que le conteneur::erase(iterator) renvoie void.Ce n'est pas un plus;c'est un changement aux exigences, ce qui a pour effet de rendre les conteneurs associatifs ne parviennent pas à satisfaire aux exigences pour les conteneurs.

Le comité des normes acceptées à ceci:

confiées au groupe de travail est d'avis que le type de retour doit être itérateur, pas la nullité.(Alex Stepanov accepte aussi.)

(LWG = Bibliothèque de Groupe de Travail).

L'incohérence est due à l'utilisation. vector est une séquence d'avoir un ordre sur les éléments.Même s'il est vrai que les éléments dans un map sont également classés selon certains, un critère de comparaison, ce classement est la non-évidence de la structure.Il n'existe pas de moyen efficace d'obtenir à partir d'un élément à l'autre (efficace = constante de temps).En fait, pour itérer sur la carte est assez cher;la création de l'itérateur ou l'itérateur lui-même implique une promenade sur l'ensemble de l'arbre.Cela ne peut être fait dans O(n), sauf si une pile est utilisée, dans ce cas l'espace requis n'est plus constante.

Dans l'ensemble, il n'ya tout simplement aucun moyen pas cher de retour de la “prochaine” de l'élément après l'effacement.Pour les séquences, il n'y est un moyen.

En outre, Rob est à droite.Il n'y a pas besoin de la Carte pour retourner un itérateur.

Juste en aparté, la STL livré avec MS Visual Studio C++ (Dinkumware IIRC) fournit une carte de mise en œuvre avec un erase fonction retournant un itérateur sur l'élément suivant.

Ils ne note ce n'est pas les normes de mise en conformité.

Je n'ai aucune idée si c'est la réponse, mais l'une des raisons pourrait être le coût de la localisation de l'élément suivant.Une itération à travers une carte est intrinsèquement "lent".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top