Heim > Artikel > Backend-Entwicklung > Wie kann ein benutzerdefinierter Iterator die Iteration durch verschachtelte Container vereinfachen?
Das Durchlaufen verschachtelter Container kann oft eine mühsame und fehleranfällige Aufgabe sein. Um diesen Prozess zu vereinfachen, untersuchen wir das Konzept eines „Flattening“-Iterators, der es uns ermöglicht, eine Hierarchie von Containern als eine einzelne, abgeflachte Sequenz zu behandeln.
Angenommen, wir haben eine Menge von Vektoren, die ganze Zahlen enthalten, und wir möchten sie als einzelne, zusammenhängende Liste durchlaufen. Ein einfacher std::vector
Um dieses Problem zu beheben, können wir einen benutzerdefinierten Iterator, flattening_iterator, erstellen, der die verschachtelten Container nacheinander durchläuft. Dieser Iterator:
Der flattening_iterator wird wie folgt implementiert:
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_; };
Wir können den flattening_iterator verwenden, um verschachtelte Container zu reduzieren wie folgt:
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; }
Dadurch wird die abgeflachte Liste ausgegeben aller Ganzzahlen in den verschachtelten Containern:
1 2 3 4 5 6 7 8 9 10 11 12
Der flattening_iterator bietet eine einfache und effektive Möglichkeit, über verschachtelte Container als einzelne, abgeflachte Sequenz zu iterieren. Dies vereinfacht den Code und macht komplexe verschachtelte Schleifenstrukturen oder manuelle Navigation durch die verschachtelte Hierarchie überflüssig.
Das obige ist der detaillierte Inhalt vonWie kann ein benutzerdefinierter Iterator die Iteration durch verschachtelte Container vereinfachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!