web-dev-qa-db-fra.com

Comment obtenir l'élément suivant (précédent) dans std :: list sans incrémenter (décrémenter) l'itérateur?

Disons que j'ai un std::list<int> lst Et quelques std::list<int>::iterator it Pour parcourir la liste. Et cela dépendait de la valeur de it Je veux utiliser it + 1 Ou it - 1 Dans mon code. Existe-t-il un bon moyen de le faire comme next(), prev() (je n'ai pas trouvé de telles choses dans la documentation stl)? Ou dois-je copier le it à chaque fois et incrémenter (décrémenter) la copie?

45
Mihran Hovsepyan

Copier et incrémenter/décrémenter la copie est la seule façon de le faire.

Vous pouvez écrire des fonctions wrapper pour le cacher (et comme mentionné dans les réponses, C++ 11 a std :: prev/std :: next qui font exactement cela (et Boost définit des fonctions similaires). Mais ce sont des wrappers autour de cette "copie et incrémentez "l'opération, ainsi vous n'avez pas à vous soucier de le faire" mal ".

20
jalf

Oui, depuis C++ 11, vous recherchez les deux méthodes appelées std::prev et std::next. Vous pouvez les trouver dans la bibliothèque d'itérateurs.

Exemple de cppreference.com

#include <iostream>
#include <iterator>
#include <vector>

int main() 
{
    std::list<int> v{ 3, 1, 4 };

    auto it = v.begin();

    auto nx = std::next(it, 2);

    std::cout << *it << ' ' << *nx << '\n';
}

Production:

3 4
47
inf

Une solution simple pré-planifiée est prior et next de Boost.utility . Ils profitent de operator-- et operator++ mais ne vous oblige pas à créer un temporaire.

6
Benjamin Bannier