2009-06-23 5 views
34

Puis-je faire des calculs normaux avec des itérateurs, c'est-à-dire simplement l'incrémenter en ajoutant un nombre?Puis-je incrémenter un itérateur en ajoutant simplement un nombre?

À titre d'exemple, si je veux supprimer l'élément vec[3], puis-je faire ceci:

std::vector<int> vec; 
for(int i = 0; i < 5; ++i){ 
     vec.push_back(i); 
} 
vec.erase(vec.begin() + 3); // removes vec[3] element 

Il fonctionne pour moi (g ++), mais je ne suis pas sûr si elle est garanti travailler.

Répondre

42

Il fonctionne si l'itérateur est un itérateur d'accès aléatoire, ce qui itérateurs de vecteur sont (voir reference). La fonction STL std::advance peut être utilisée pour faire avancer un itérateur générique, mais comme elle ne renvoie pas l'itérateur, j'ai tendance à utiliser + si elle est disponible parce qu'elle semble plus propre.

C++ 11 Note

Maintenant il y a std::next et std::prev, qui faire retourner le iterator, donc si vous travaillez dans la terre de modèle que vous pouvez les utiliser pour faire avancer un iterator générique et ont encore code propre.

+7

Oh, alors ça ne marcherait pas pour std :: liste? – Frank

+2

Correct; ajouté quelques liens de documentation qui énumèrent quelles fonctions devraient être disponibles pour quels types d'itérateurs. –

+1

Non, ce n'est pas le cas. L'opérateur + signifie "en une étape, saute si loin", ce qu'un itérateur de liste ne peut pas faire. Les itérateurs d'accès non aléatoires (comme les itérateurs de liste) supportent uniquement l'opérateur d'incrément (++) pour faire avancer un élément à la fois. Comme Todd l'a dit, vous pouvez utiliser std :: advance, qui invoque l'opérateur ++ à plusieurs reprises, pour exprimer succinctement l'idée de déplacer un itérateur non aléatoire d'un certain nombre d'étapes. –

2

Il fonctionne avec itérateurs d'accès aléatoire. En général, vous voudrez peut-être regarder std::advance qui est plus générique. Assurez-vous simplement de comprendre les implications de performance de l'utilisation de ce modèle de fonction.

Questions connexes