Comment faire pour incrémenter un itérateur par 2?
Quelqu'un peut-il me dire comment faire pour incrémenter la variable d'itération par 2?
iter++
est disponible - ce que je dois faire iter+2
? Comment puis-je y parvenir?
- En juger par le nombre de réponses, vous devez préciser votre question.
- Oui. Quel type d'itérateur est-il? Montrer un peu de code.
Vous devez vous connecter pour publier un commentaire.
std::advance( iter, 2 );
Cette méthode fonctionne pour les itérateurs qui ne sont pas en accès aléatoire itérateurs, mais il peut encore être spécialisé par la mise en œuvre seront pas moins efficace que
iter += 2
lorsqu'il est utilisé avec accès aléatoire itérateurs.http://www.cplusplus.com/reference/std/iterator/advance/
où n est 2 dans votre cas.
La beauté de cette fonction est, que Si "il" est un itérateur à accès aléatoire, la rapide
opération est utilisée (c'est à dire vector<,>::iterator). Sinon, le rendu de
(c'est à dire une liste<..>::iterator)
Si vous n'avez pas modifiable lvalue d'un itérateur, ou l'on désire obtenir une copie d'un itérateur (en laissant l'original inchangé), puis C++11 est livré avec de nouvelles fonctions d'assistance -
std::next
/std::prev
:map<string,string>::iterator iter; for(iter = variations.begin(); iter != variations.end(); iter++) { map<string,string>::iterator it_tmp = std::next(iter, 1); // increment by 1 it_tmp = std::next(iter, 2); // increment by 2 }
Sera iter être incrémenté par 2 ? ou iter sera seulement sur it_tmp?Vous pouvez utiliser l'affectation par l'ajout d' " opérateur
Si vous ne savez pas si vous avez assez à côté d'éléments dans votre récipient ou pas, vous avez besoin de vérifier à la fin de votre conteneur entre chaque incrément. Ni ++, ni std::advance va le faire pour vous.
Vous pouvez même rouler votre propre lié-secure avance de la fonction.
Si vous êtes sûr que vous ne serez pas aller au-delà de la fin, puis std::advance( iter, 2 ) est la meilleure solution.
Nous pouvons utiliser les deux std::advance ainsi que std::suivant, mais il y a une différence entre les deux.
advance
modifie son argument et ne renvoie rien. De sorte qu'il peut être utilisé comme:next
renvoie une copie modifiée de l'itérateur:En supposant que la taille de la liste peut ne pas être un multiple de l'étape vous devez vous prémunir contre overflow:
En fonction de la collection de la mise en œuvre, la distance de calcul peut être très lent. Ci-dessous est optimale et plus lisible. La fermeture pourrait être changé pour un modèle pour les services publics avec la fin la liste des valeur transmise par const référence:
Si il n'y a pas de boucle:
La réponse très simple:
La réponse longue:
Vous devriez vraiment s'habituer à l'écriture
++iter
au lieu deiter++
. Ce dernier doit retourner une copie de l'ancienne valeur, qui est différente de la valeur nouvelle; cela prend du temps et de l'espace.Notez que le préfixe de l'incrément (
++iter
) prend une lvalue et renvoie une lvalue, alors que postfix incrément (iter++
) prend une lvalue et renvoie une rvalue.iter
est un pointeur brut (que certains types iterator peut être).++it; ++it;
ce serait bien.