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& 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); }
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!