Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ein benutzerdefinierter Iterator die Iteration durch verschachtelte Container vereinfachen?

Wie kann ein benutzerdefinierter Iterator die Iteration durch verschachtelte Container vereinfachen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-26 05:36:09622Durchsuche

How Can a Custom Iterator Simplify Iterating Through Nested Containers?

Verschachtelte Container mit einem benutzerdefinierten Iterator reduzieren

Einführung

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.

Problem

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> reicht möglicherweise nicht aus, da dafür die Navigation durch jeden verschachtelten Vektor separat erfolgen muss.

Benutzerdefinierter flattening_iterator

Um dieses Problem zu beheben, können wir einen benutzerdefinierten Iterator, flattening_iterator, erstellen, der die verschachtelten Container nacheinander durchläuft. Dieser Iterator:

  • Verwendet als Eingabe einen Iterator zum äußersten Container.
  • Verfolgt die aktuelle Position sowohl im äußersten als auch im innersten Container.
  • Vorwärts Der Iterator bewegt sich schrittweise durch die verschachtelten Container, bis er das Ende erreicht oder auf ein leeres Innerstes stößt Container.

Implementierung

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_;
};

Verwendung

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

Fazit

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn