2009-12-29 8 views
1

En utilisant http://www.cppreference.com/wiki/stl/deque/insert comme référence, j'insérais des valeurs dans un deque à certains endroits.stl :: insert de deque (loc, val) - comportement incohérent à la fin de deque par rapport à d'autres emplacements?

Par exemple, si deque A était:

a, b, d, e, g 

avec un itérateur pointant vers d, je peux:

A.insert(iter, c); // insert val c before loc iter 
//deque is now a, b, c, d, e, g 

et iter encore des points à d. Cependant, lorsque les points iter à g, le dernier élément:

A.insert(iter, f); 
//deque is now a, b, c, d, e, f, g 

mais le iter pointe maintenant vers f !!

Ma solution actuelle est:

iter = A.insert(loc, val); // point iterator to element that was inserted before loc 
iter++;      // point iter back to loc 

Je n'ai pas testé à nouveau ou quoi que ce soit, il a été ennuyeux d'avoir passé tant de temps suivi d'un bug vers le bas, juste pour découvrir insert() s 'incompatible comportement, en stl, de tous les lieux .

Pourquoi insert() se comporte-t-il différemment à la fin, par rapport à n'importe quel autre emplacement? Ou est-ce que j'ai fait quelque chose de mal?

Répondre

7

L'exécution d'une insertion invalide tous les itérateurs existants, de sorte que vous obtiendrez un comportement imprévisible (éventuellement un blocage) en réutilisant l'ancien itérateur.

Votre solution de contournement est la bonne solution. Editer: En ce qui concerne votre deuxième question, il vous manque des accolades après if (*iter == 'g'). À l'avenir cependant, s'il vous plaît mettre de nouvelles questions dans un nouveau message.

+0

23.2.1.3 dans la norme, pour quiconque se demande. – GManNickG

+1

Quelles sont les autres opérations effectuées? Tout ce qui change la taille() de la deque, comme insérer, effacer, pop, pousser, redimensionner? Qu'en est-il de changer un élément quelque part dans la boucle, comme: * iter = 'z'; – Kache

+0

Il varie d'un conteneur à l'autre. Pour un 'deque', toute insertion ou suppression au milieu de la séquence invalidera tous les itérateurs existants. Ajout ou suppression des extrémités ne sera pas. De plus, si vous faites beaucoup d'insertions au milieu de la séquence, vous feriez probablement mieux d'utiliser 'list' au lieu de' deque'. – coppro