2009-08-25 6 views
3

Où la norme C++ déclare-t-elle que la paire d'itérateurs passée à std::vector::insert ne doit pas chevaucher la séquence d'origine?Le comportement du vecteur chevauché :: insert

Edit: Pour préciser, je suis assez sûr que la norme ne nécessite pas la bibliothèque standard pour gérer les situations comme ceci:

std::vector<int> v(10); 
std::vector<int>::iterator first = v.begin() + 5; 
std::vector<int>::iterator last = v.begin() + 8; 
v.insert(v.begin() + 2, first, last); 

Cependant, je ne pouvais pas trouver quoi que ce soit dans la norme, ce serait interdire les plages [first, last) et [v.begin(), v.end()) de se chevaucher.

Répondre

7

23.1.1/4 exigences de séquence a:

expression: a.insert (p, i, j)

type de retour: vide

condition:Je ne suis pas itérateur dans un. insère des copies d'éléments dans [i, j) avant p.

Donc i et j ne peuvent pas être des itérateurs dans votre vecteur. Il est logique que, comme lors de l'insertion, le vecteur ait besoin de se redimensionner lui-même, les éléments existants peuvent d'abord être copiés dans un nouvel emplacement de mémoire (en invalidant les itérateurs actuels).

+0

Merci beaucoup, c'est exactement ce que je cherchais. :-) – avakar

+1

Assez sûr que vous voulez dire 'i' et' j', pas 'p'; 'p' * doit * être un itérateur dans le vecteur. –

+0

Merci d'avoir rattrapé ce Rob. –

3

Considérez le comportement s'il était autorisé. Chaque insertion dans le vecteur augmente à la fois la distance entre l'itérateur de début et de fin et déplace l'itérateur de départ d'une unité. Par conséquent, l'itérateur de démarrage n'atteindra jamais l'itérateur de fin et l'algorithme s'exécutera jusqu'à ce qu'une exception de mémoire insuffisante se produise.

+0

Voulez-vous dire que la norme n'énonce pas explicitement cette exigence? – avakar

+0

Je l'ai vérifié rapidement et oui, il ne le dit pas explicitement. – AraK

+0

AraK, avec tout mon respect, comment pourriez-vous vérifier quelque chose comme ça rapidement? – avakar

Questions connexes