Itérer dans des conteneurs imbriqués peut souvent être une tâche fastidieuse et sujette aux erreurs. Pour simplifier ce processus, nous explorons le concept d'itérateur « d'aplatissement », qui nous permet de traiter une hiérarchie de conteneurs comme une séquence unique et aplatie.
Supposons que nous ayons un ensemble de vecteurs contenant des entiers, et nous voulons les parcourir comme une liste unique et contiguë. Un simple std::vecteur
Pour résoudre ce problème, nous pouvons créer un itérateur personnalisé, flattening_iterator, qui parcourt les conteneurs imbriqués de manière séquentielle. Cet itérateur :
Le flattening_iterator est implémenté comme suit :
template <typename OuterIterator> class flattening_iterator { public: // ... iterator category, value type, etc. flattening_iterator(outer_iterator it) : outer_it_(it), outer_end_(it) { } flattening_iterator(outer_iterator it, outer_iterator end) : outer_it_(it), outer_end_(end) { advance_past_empty_inner_containers(); } // ... operators for comparison, dereferencing, and advancement private: void advance_past_empty_inner_containers() { // Advance until we find a non-empty innermost container while (outer_it_ != outer_end_ && inner_it_ == outer_it_->end()) { ++outer_it_; if (outer_it_ != outer_end_) inner_it_ = outer_it_->begin(); } } outer_iterator outer_it_; outer_iterator outer_end_; inner_iterator inner_it_; };
Nous pouvons utiliser le flattening_iterator pour aplatir les conteneurs imbriqués comme suit :
std::unordered_set<std::vector<int>> s; s.insert({}); s.insert({1,2,3,4,5}); s.insert({6,7,8}); s.insert({9,10,11,12}); // Create a flattening iterator and iterate over the flattened set for (auto it = flatten(s.begin()); it != s.end(); ++it) { std::cout << *it << endl; }
Cela affichera la liste aplatie des tous les entiers dans les conteneurs imbriqués :
1 2 3 4 5 6 7 8 9 10 11 12
Le flattening_iterator fournit un moyen simple et efficace de parcourir les conteneurs imbriqués en une seule séquence aplatie. Cela simplifie le code et élimine le besoin de structures de boucles imbriquées complexes ou de navigation manuelle dans la hiérarchie imbriquée.
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!