Maison >développement back-end >C++ >Comment puis-je obtenir l'index de l'élément actuel dans une boucle For basée sur une plage C ?

Comment puis-je obtenir l'index de l'élément actuel dans une boucle For basée sur une plage C ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-29 07:43:09818parcourir

How Can I Get the Index of the Current Element in a C   Range-Based For Loop?

Recherche de l'index de l'objet actuel dans une boucle For basée sur une plage

Dans une boucle for basée sur une plage, itération dans un conteneur fournit un accès direct à chaque élément sans nécessiter un itérateur explicite. Cependant, il peut y avoir des situations où il devient nécessaire de déterminer l'index de l'élément actuel dans la boucle sans s'appuyer sur un itérateur distinct. Cette question explore une méthode pour y parvenir en utilisant une composition et une technique de fermeture éclair spécialisée.

Technique de fermeture éclair

La clé de cette approche réside dans la « fermeture éclair » du conteneur avec un index en cours de route. Une classe Zipper est conçue pour créer un objet de type itérateur qui donne accès à la fois à l'index et à la valeur de l'élément dans le conteneur. Cette fermeture éclair sert efficacement d'enveloppe autour de l'itérateur du conteneur d'origine.

Implémentation

Le code C fourni démontre cette technique :

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&amp; operator++() { ++_pos; ++_it; return *this; }
        iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }

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

    private:
        size_t _pos;
        inner_iterator _it;
    };

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

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

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

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

Ceci Le code définit une classe Indexer qui crée un itérateur indexé pour un conteneur T donné. La classe iterator fournit une référence à une paire contenant l'index et le valeur de l'élément. La fonction index renvoie un objet Indexer qui peut être utilisé dans la boucle for basée sur une plage pour accéder à la fois à l'index et à la valeur.

Utilisation

Pour utiliser cette technique , compressez simplement le vecteur avec une plage d'entiers à l'aide de la fonction index :

#include <iostream>
#include <iterator>
#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 variable p indexée parcourt les éléments du vecteur v, donnant accès à la fois à l’index et à la valeur. Vous pouvez ensuite accéder facilement à ces valeurs au sein de la boucle.

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