Recherche des positions des éléments dans des boucles For basées sur une plage
En programmation, il est souvent nécessaire de déterminer l'index ou la position des éléments itérés sur. Lors de l'utilisation de boucles for basées sur une plage, qui offrent un moyen pratique de parcourir les conteneurs, la question se pose de savoir s'il est possible de récupérer l'index de l'élément actuel sans utiliser un itérateur séparé.
Solutions
1. Technique de fermeture éclair
Une méthode consiste à utiliser une technique appelée fermeture éclair. Cela implique de combiner le conteneur avec un index en cours de route, créant une nouvelle plage de paires où chaque paire est constituée de l'index et de l'élément correspondant.
struct Indexer { class iterator { iterator(typename T::iterator it): _pos(0), _it(it) {} std::pair<size_t, typename T::reference> operator*() const { return std::make_pair(_pos, *_it); } // ... }; iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; };
En utilisant la classe Indexer, il devient possible d'itérer sur des conteneurs et obtenez simultanément l'index et l'élément.
2. Boost.Range
Une autre option consiste à utiliser la bibliothèque Boost.Range. Plus précisément, l'adaptateur boost::adaptors::indexed peut être utilisé pour créer une plage dérivée qui inclut à la fois l'index et l'élément pour chaque itération.
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto const& [idx, elem]: boost::adaptors::indexed(v)) { std::cout << idx << ": " << elem << "\n"; }
En itérant sur la plage résultante obtenue à partir de boost : :adaptors::indexed, l'index et l'élément sont accessibles dans la boucle for.
3. Itérateur personnalisé
Dans certains scénarios, il peut être souhaitable de créer un itérateur personnalisé qui conserve l'index actuel. Cet itérateur peut être utilisé conjointement avec des boucles for basées sur une plage pour accéder à la fois à l'index et à l'élément.
class IndexedIterator { private: container_type* _container; size_t _index; public: IndexedIterator(container_type* c) : _container(c), _index(0) {} bool operator!=(const IndexedIterator& other) const { return _container != other._container || _index != other._index; } std::pair<size_t, value_type> operator*() const { return std::make_pair(_index, *_container[_index]); } IndexedIterator& operator++() { _index++; return *this; } };
En définissant un itérateur personnalisé et en l'adaptant au type d'itérateur du conteneur, il est possible d'obtenir l'élément et son index directement dans la boucle for.
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!