Incrémenter un itérateur c++
Mon problème est le suivant: j'utilise un itérateur, et je veux comparer chaque élément à l'élément suivant. Prototype ressemble à ci-dessous, comment puis-je augmenter l'itérateur pour pouvoir comparer?
Aussi, comment puis-je définir un état convenable pour que cela arrive? Je veux dire, comment faire le point sur le dernier élément, et non pas sur le côté après le dernier comme avec la fonction end ():
std::vector<T>::const_iterator it;
std::vector<T>::const_iterator it2;
for (it = set.begin(), it != set.end(); it++)
{
//some things happen
if ( final == it )
{
if ( it != set.end()-1 ) //how to write properly condition?
{
it2 = it + 1; //how to assign the next here?
if (...)//some condition
{
if ( it->func1() - it2->func1()) < 20 ) //actual comparison of two consecutive element values
//do something
}
}
}
}
- Quel est le problème que vous essayez de résoudre avec ceux de plusieurs itérateurs?
- J'utilise jusqu'à maintenant, juste un itérateur (c'est juste une partie de code). Je veux être en mesure de comparer func1 de deux années consécutives dans le jeu. j'ai donc besoin d'un itérateur pointant sur le réel, l'un sur l'autre. est-il une meilleure approche? J'ai peut-être fait de certains matraquage ici, corrigez-moi plz
- Voir ma réponse pour cette dernière question Comment faire une boucle sur consécutifs paires dans un conteneur STL?.
- pour
set.end()-1
, utilisezset.rbegin()
Vous devez vous connecter pour publier un commentaire.
Dans C++11 utiliser les fonctions std::next() et std::prev().
Votre code pourrait devenir:
et
Qui est vrai aussi pour les non-vecteur de récipients, tels que des carte,définir ou autres.
REMARQUE: après
std::next(it)
, "il" itérateur reste inchangé!NOTE 2: Utilisation
it2 = std::next(it,n);
d'augmenter autant que vous avez besoin.Vous pouvez utiliser adjacent_find pour le résoudre. Vous devez utiliser la deuxième forme de la fonction (avec prédicat) et passer le prédicat votre
some things happen
etsome condition
en c-torBasée sur le fait que
it++
est acceptable, nous devons définir un nouvel itérateur appeléitplusone
, qui est initialisé commeitplusone = ++it
. De cette façon, vous pouvez utiliser en toute sécurité le sens d'un itérateur pointant vers l'élément suivant deit
. Aussi clairement, la gamme de itérateur deitplusone
délimitée par des termesitplusone != set.end()
. J'utilise cette méthode pour calculer le poids total d'un chemin, qui est défini comme un objet de la liste.Dans le
for
boucle, vous utilisezit++
qui signifieit = it + 1
, ce qui est parfaitement ok. Ce sera très bien aussiit2 = it + 1
.it2
pointe à la valeur suivante.Dans le
for
boucle encore une fois, vous utilisezit != set.end()
, qui est à nouveau parfaitement ok. Ainsi, vous pouvez égalementit + 1 < set.end()
, tout comme vous l'avez fait dans votre code.Je ne vois rien de mal dans votre code, je voulais juste expliquer.
std::vector
, mais en général,it++
n' pas signifieit = it + 1
. Tous les itérateurs de soutien de l'incrément, mais seulement des itérateurs à accès aléatoire soutien plus.