2010-02-28 1 views
11

Actuellement, j'utilise un itérateur pour rechercher un vecteur et tester ses éléments. J'accéder aux éléments à l'aidePuis-je faire de l'arithmétique de pointeur sur un STL :: vector :: itérateur

std::vector<int>::iterator it; 
if (*it == 0); 

Puis-je utiliser la même logique de style arithmétique de pointeur pour tester également l'élément suivant (sans altérer ma iterator)?

Je dois d'abord voir si elle va pousser le iterator hors des limites

if (it != myvec.end()) 

Ensuite, testez les deux élément courant et élément suivant

if (*it == 1 && *(it + 1) == 1) 

ce travail que j'attendre de l'utilisation des pointeurs?

Répondre

16

Oui, les itérateurs pour std::vector sont random access iterators de sorte que vous ajoutez/soustrayez des valeurs entières pour obtenir d'autres itérateurs valides. Techniquement, ce n'est peut-être pas de l'arithmétique de pointeur, mais ils agissent comme des pointeurs.

+0

Donc, je ne peux pas faire d'opération arithmétique sur 'list :: itérateur', non? – Alcott

+1

@Alcott - correct. Un list :: iterator est un itérateur bidirectionnel et ne supporte pas l'accès aléatoire. Vous pouvez utiliser 'std :: advance' pour faire le déplacement avec un seul appel mais la complexité de l'avance est' O (n) 'pour les listes (où ce serait' O (1) 'pour un vecteur). –

3

Cela fonctionnera en effet comme l'itérateur vectoriel est l'itérateur d'accès aléatoire. C'est non seulement vous pouvez agir sur eux comme vous le feriez avec des pointeurs, mais ils sont pratiquement mis en œuvre en utilisant des pointeurs/arithmétique de pointeur.

1

Eh bien, si iterator est le dernier élément du conteneur puis

*(it + 1) 

a un comportement non défini. Vous devez vérifier que

it + 1 != end 

avant déréférencement il.

+1

Donc un peu comme utiliser des pointeurs, vous devez vérifier vous-même qu'il ne sort pas des limites. – Dom