Maison >développement back-end >C++ >Comment puis-je obtenir l'index d'un élément lors d'une itération sur un vecteur à l'aide d'une boucle for basée sur une plage en C ?

Comment puis-je obtenir l'index d'un élément lors d'une itération sur un vecteur à l'aide d'une boucle for basée sur une plage en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-05 03:18:11931parcourir

How can I get the index of an element while iterating through a vector using a range-based for loop in C  ?

Extraction d'index à l'aide de boucles For basées sur une plage

En programmation C, une boucle for basée sur une plage offre un moyen concis de parcourir les éléments d'un conteneur. Cependant, il devient parfois nécessaire de déterminer l'index de l'élément courant lors de l'itération sans s'appuyer sur un itérateur supplémentaire.

Problème :

Étant donné un vecteur de valeurs et une boucle for basée sur une plage comme indiqué ci-dessous :

vector<int> list;
for(auto& elem:list) {
    int i = elem;
}

Existe-t-il un moyen de trouver la position de l'élément dans le vecteur sans maintenir un itérateur séparé ?

Solution :

Oui, il est possible d'extraire l'index tout en parcourant une boucle for basée sur une plage. Cette technique implique une combinaison de structures modélisées et d'itérateurs :

template <typename T>
struct iterator_extractor { typedef typename T::iterator type; };

template <typename T>
struct iterator_extractor<T const&> { typedef typename T::const_iterator type; };

template <typename T>
class Indexer {
public:
    class iterator {
        typedef typename iterator_extractor<T>::type inner_iterator;
        typedef typename std::iterator_traits<inner_iterator>::reference inner_reference;
    public:
        typedef std::pair<size_t, inner_reference&> reference;

        iterator(inner_iterator it): _pos(0), _it(it) {}

        reference operator*() const { return reference(_pos, *_it); }

        iterator& operator++() { ++_pos; ++_it; return *this; }
        iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }

        bool operator==(iterator const& it) const { return _it == it._it; }
        bool operator!=(iterator const& it) const { return !(*this == it); }

    private:
        size_t _pos;
        inner_iterator _it;
    };

    Indexer(T& t): _container(t) {}

    iterator begin() const { return iterator(_container.begin()); }
    iterator end() const { return iterator(_container.end()); }

private:
    T& _container;
}; // class Indexer

template <typename T>
Indexer<T> index(T& t) { return Indexer<T>(t); }

Cet extrait de code offre la possibilité de parcourir un conteneur tout en capturant simultanément l'index et la valeur. La classe Indexer enveloppe le conteneur et fournit un itérateur personnalisé qui génère des paires d'index et de références d'éléments.

Exemple d'utilisation :

Pour utiliser la classe Indexer dans une plage : basé sur la boucle for, vous pouvez faire ce qui suit :

#include <iostream>
#include <limits>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};

    for (auto p: index(v)) {
        std::cout << p.first << ": " << p.second << "\n";
    }
}

Dans cet exemple, la boucle imprimera chaque élément du vecteur avec son indice :

0: 1
1: 2
2: 3
3: 4
4: 5
5: 6
6: 7
7: 8
8: 9

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn