2010-10-07 5 views
20
std::vector<string> names; 
std::vector<string>::iterator start = names.begin(); 
std::vector<string>::iterator end = names.end(); 
sort (start,end); 
//are my start and end valid at this point? 
//or they do not point to front and tail resp? 
+0

Je suppose que cela devrait être 'std :: vector :: iterator start'? –

+1

Même s'il est vrai, le développeur qui vient après vous perdre une journée à essayer de prouver c'est la cause racine pour un bug ... il fixation –

+0

@Ben, merci, désolé mal copier-coller! –

Répondre

18

Selon le C++ standard § 23,1/11:

, sauf indication contraire (explicitement ou en définissant une fonction en termes d'autres fonctions), en invoquant une fonction membre de conteneur ou le passage d'un récipient comme argument pour une fonction de bibliothèque ne doit pas invalider itérateurs, ou modifier les valeurs des objets dans ce conteneur.

§ 25,3 « Tri et opérations connexes » ne précise pas que les itérateurs seront invalidés, si itérateurs dans la question devrait rester valide.

11

Ils pointent toujours au début et à la fin. Les valeurs dans ces emplacements du vecteur ont probablement changé, mais l'emplacement de stockage dans lequel réside chacun reste le même.

1

std::vector conserve ses éléments en mémoire contigus. std::sort prend les arguments (itérateurs) par valeur et réarrange la séquence entre eux. Le résultat net est que vos variables locales start et end pointent toujours sur les premiers et derniers éléments du vecteur.

6

std::sort n'invalidera itérateurs à un vecteur. Le modèle de tri utilise l'opérateur * sur les itérateurs pour accéder et modifier le contenu du vecteur, et la modification d'un élément vectoriel par l'intermédiaire d'un itérateur vers un élément déjà présent dans le vecteur n'invalidera pas les itérateurs.

En résumé,

  • vos itérateurs existantes ne seront pas invalidés
  • cependant, les éléments qu'ils pointent vers peuvent avoir été modifiés

En plus du soutien à la norme prévue par Kirill V. Lyadvinsky (Does a vector sort invalidate iterators?):

  • 25/5 "Algorit bibliothèque hms »

Si la section Effets d'un algorithme dit qu'une valeur pointée par un iterator passé en argument est modifié , alors cet algorithme a une exigence de type supplémentaire : Le type de cette l'argument doit satisfaire aux exigences d'un itérateur mutable (24.1).

  • 24.1/4 « exigences » Iterator

Outre sa catégorie, un avant, bidirectionnelle ou accès aléatoire iterator peut aussi être mutable ou constante selon que le résultat de l'expression * i se comporte comme une référence ou une référence à une constante .