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
Libérer: 2024-12-05 03:18:11
original
944 Les gens l'ont consulté

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;
}
Copier après la connexion

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); }
Copier après la connexion

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";
    }
}
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal