132 votes

Itération du vecteur C++ de la fin au début

Est-il possible d'itérer un vecteur de la fin au début ?

for (vector<my_class>::iterator i = my_vector.end();
        i != my_vector.begin(); /* ?! */ ) {
}

Ou est-ce seulement possible avec quelque chose comme ça :

for (int i = my_vector.size() - 1; i >= 0; --i) {
}

3 votes

En C++11, vous pouvez utiliser un for-loop basé sur l'intervalle avec un adaptateur inverse, voir ici

1 votes

Théoriquement, sur une machine 32 bits, pour la deuxième solution, si la taille du vecteur est supérieure à 2 147 483 647 + 1, il y aura un débordement (vector::size() est non signé), mais actuellement, il y a de fortes chances que vous n'atteigniez jamais cette limite (la limite actuelle des vecteurs sur les machines 32 bits est également de 1 073 741 823).

2 votes

Le problème de débordement de @StefanRogin devient réel lorsqu'au lieu de "int i" dans la boucle for, quelqu'un utilise size_t (ou peut-être auto) dans sa quête pour éviter les avertissements du compilateur (en raison de l'affectation de size() à int). Avec cela, et pour un vecteur à un seul élément, la deuxième itération déborde auto i et la boucle s'exécute avec le "i" débordé, ce qui entraîne toutes sortes de plantages.

-1voto

amit kumar Points 1

Utiliser ce code

//print the vector element in reverse order by normal iterator.
cout <<"print the vector element in reverse order by normal iterator." <<endl;
vector<string>::iterator iter=vec.end();
--iter;
while (iter != vec.begin())
{
    cout << *iter  << " "; 
    --iter;
}

-3voto

typelogic Points 797

Comme je ne veux pas introduire une nouvelle syntaxe C++ semblable à celle d'un extraterrestre, et que je veux simplement me baser sur les primitives existantes, les extraits ci-dessous semblent fonctionner :

#include <vector>
#include <iostream>

int main (int argc,char *argv[])
{
    std::vector<int> arr{1,2,3,4,5};
    std::vector<int>::iterator it;

    // iterate forward
    for (it = arr.begin(); it != arr.end(); it++) {
        std::cout << *it << " ";
    }

    std::cout << "\n************\n";

    if (arr.size() > 0) {
        // iterate backward, simple Joe version
        it = arr.end() - 1;
        while (it != arr.begin()) {
            std::cout << *it << " ";
            it--;
        }
        std::cout << *it << " ";
    } 

    // iterate backwards, the C++ way
    std::vector<int>::reverse_iterator rit;
    for (rit = arr.rbegin(); rit != arr.rend(); rit++) {
        std::cout << *rit << " ";
    }

    return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X