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?
Répondre
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.
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.
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.
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 .
Je suppose que cela devrait être 'std :: vector :: iterator start'? –
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 –
@Ben, merci, désolé mal copier-coller! –