... es ist auf jeden Fall nützlich, die Möglichkeit zu haben, Entfernungen zu überwinden. Aber zumindest nach meiner Erfahrung ist das ein seltener Sonderfall. Normalerweise möchte ich ganze Container bearbeiten
Es mag nach Ihrer Erfahrung ein seltener Sonderfall sein , aber in Wirklichkeit ist der gesamte Container der Sonderfall, und der willkürliche Bereich ist der allgemeine Fall.
Sie haben bereits bemerkt, dass Sie den gesamten Containerfall über die aktuelle Schnittstelle implementieren können, aber nicht umgekehrt.
Der Bibliotheksschreiber hatte also die Wahl, zwei Schnittstellen im Vorfeld zu implementieren oder nur eine, die noch alle Fälle abdeckt.
Es ist einfach, eine Wrapper-Funktion zu schreiben, die einen Container entgegennimmt und darin begin () und end () aufruft. Solche praktischen Funktionen sind jedoch nicht in der Standardbibliothek enthalten
Richtig, zumal die kostenlosen Funktionen std::begin
und std::end
jetzt enthalten sind.
Nehmen wir also an, die Bibliothek bietet die Bequemlichkeitsüberladung:
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
Jetzt muss auch die äquivalente Überladung bereitgestellt werden, indem ein Vergleichs-Funktor verwendet wird, und wir müssen die Äquivalente für jeden anderen Algorithmus bereitstellen.
Aber wir haben zumindest jeden Fall abgedeckt, in dem wir mit einem vollen Container arbeiten wollen, oder? Nicht ganz. Erwägen
std::for_each(c.rbegin(), c.rend(), foo);
Wenn wir Container rückwärts verarbeiten möchten , benötigen wir eine andere Methode (oder ein Methodenpaar) pro vorhandenem Algorithmus.
Der bereichsbezogene Ansatz ist also im einfachen Sinne allgemeiner:
- es kann alles, was die Vollcontainerversion kann
- Der Gesamtcontainer-Ansatz verdoppelt oder verdreifacht die Anzahl der erforderlichen Überladungen, ist jedoch immer noch weniger leistungsfähig
- Die bereichsbasierten Algorithmen sind auch zusammensetzbar (Sie können Iteratoradapter stapeln oder verketten, obwohl dies in funktionalen Sprachen und Python häufiger vorkommt).
Es gibt natürlich noch einen anderen triftigen Grund: Es war bereits eine Menge Arbeit, die STL zu standardisieren, und das Aufblasen mit Convenience-Wrappern, bevor sie weit verbreitet war, würde die begrenzte Ausschusszeit nicht besonders belasten. Bei Interesse finden Sie hier den technischen Bericht von Stepanov & Lee
Wie in den Kommentaren erwähnt, bietet Boost.Range einen neueren Ansatz, ohne dass Änderungen am Standard erforderlich sind.