Warum gibt es in C ++ STL eine Trennung von Algorithmen, Iteratoren und Containern?

8

Ich kann nicht herausfinden, warum sie Algorithmen, Iteratoren und Container in C ++ STL getrennt haben. Wenn die Vorlagen überall stark verwendet werden, können wir Klassen haben, die alles mit Template-Parametern an einem Ort haben.

Einige Texte, die ich erhalten habe, erklären, dass Iteratoren Algorithmen helfen, mit Containerdaten zu interagieren, aber was ist, wenn Container einen Mechanismus zum Zugriff auf die Daten offenlegen, die sie besitzt?

    
Rahul 14.08.2012, 06:50
quelle

1 Antwort

22

Bei M containers + N Algorithmen benötigt man normalerweise M * N Code, aber wenn Iteratoren als "Leim" fungieren, kann dies auf M + N Code reduziert werden.

Beispiel: Führen Sie 2 Algorithmen auf 3 Containern aus

%Vor%

Sie rufen nur zwei verschiedene Algorithmen auf und haben nur Code für drei Container. Jeder Container übergibt die Iteratoren begin() und end() an den Container. Obwohl Sie 3 * 2 Codezeilen haben, um die Antworten zu generieren, gibt es nur 3 + 2 Funktionen, die geschrieben werden müssen.

Für mehr Container und Algorithmen ist diese Trennung eine enorme Verringerung der kombinatorischen Explosion im Code, die sonst folgen würde: Es gibt 5 Sequenzcontainer, 8 assoziative Container und 3 Containeradapter in der STL, und es gibt fast 80 Algorithmen <algorithm> alleine (nicht einmal die in <numeric> ), so dass Sie nur 16 + 80 anstelle von 16 * 80 haben, eine 13-fache Reduzierung des Codes! (Natürlich ist nicht jeder Algorithmus auf jedem Container sinnvoll, aber der Punkt sollte klar sein).

Die Iteratoren können in 5 Kategorien unterteilt werden (Eingabe, Ausgabe, Weiterleitung, bidirektionaler und wahlfreier Zugriff), und einige Algorithmen delegieren abhängig von den Iteratorfähigkeiten an spezialisierte Versionen. Dies wird die Code-Reduktion etwas verringern, aber die Effizienz stark verbessern, indem der am besten geeignete Algorithmus für den Iterator ausgewählt wird.

Beachten Sie, dass die STL in der Trennung nicht vollständig konsistent ist: std::list hat eine eigene sort -Memberfunktion, die implementierungsspezifische Details verwendet, um sich selbst zu sortieren, und std::string hat eine enorme Anzahl von Mitgliedsfunktionsalgorithmen, die meisten davon welche hätten als Nichtmitgliedsfunktionen implementiert werden können.

    
TemplateRex 14.08.2012, 08:22
quelle