Comment déterminer l'index d'un objet dans une boucle for basée sur une plage
Dans le contexte de boucles for basées sur une plage, il est souvent Il est souhaitable d'accéder à l'index de l'élément actuel dans le conteneur. Considérez le code suivant :
vector<int> list; for (auto& elem : list) { int i = elem; }
Dans ce scénario, vous souhaiterez peut-être connaître la position de elem dans le vecteur de liste sans maintenir un itérateur séparé.
Approche basée sur Zipper
Pour y parvenir, une approche « zipper » peut être utilisée. Au lieu d'itérer directement sur le conteneur, vous pouvez le "compresser" avec un index en cours de route.
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 { public: typedef std::pair<size_t, typename iterator_extractor<T>::type::reference> reference; iterator(typename iterator_extractor<T>::type 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==(const iterator& it) const { return _it == it._it; } bool operator!=(const iterator& it) const { return !(*this == it); } private: size_t _pos; typename iterator_extractor<T>::type _it; }; Indexer(T& t) : _container(t) {} iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; }; template <typename T> Indexer<T>& index(T& t) { return Indexer<T>(t); }
Ce code crée une classe Indexer qui fournit un itérateur qui combine l'élément et son index dans une paire . En utilisant cet indexeur, vous pouvez accéder simultanément à l'index et à l'élément.
Exemple d'utilisation
Le code suivant montre comment utiliser l'approche zippée :
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto p : index(v)) { cout << p.first << ": " << p.second << "\n"; } return 0; }
Ce code imprimera les valeurs de l'index et de l'élément au format suivant :
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!