... zdecydowanie warto mieć opcję przekazywania zakresów. Ale przynajmniej z mojego doświadczenia to rzadki wyjątkowy przypadek. Zazwyczaj będę chciał operować na całych kontenerach
Może to być rzadki szczególny przypadek z twojego doświadczenia , ale w rzeczywistości cały pojemnik jest szczególnym przypadkiem, a arbitralny zasięg jest przypadkiem ogólnym.
Zauważyłeś już, że możesz zaimplementować całą skrzynkę kontenera za pomocą bieżącego interfejsu, ale nie możesz tego zrobić.
Tak więc autor biblioteki miał wybór między implementacją dwóch interfejsów z góry, a tylko implementacją jednego, który wciąż obejmuje wszystkie przypadki.
Łatwo jest napisać funkcję otoki, która zabiera kontener i wywołuje na nim wywołania begin () i end (), ale takie funkcje wygody nie są zawarte w standardowej bibliotece
To prawda, zwłaszcza, że darmowe funkcje std::begin
i std::end
są teraz włączone.
Powiedzmy, że biblioteka zapewnia przeciążenie wygody:
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
teraz musi również zapewnić równoważne przeciążenie, biorąc funktor porównawczy, i musimy zapewnić odpowiedniki dla każdego innego algorytmu.
Ale przynajmniej objęliśmy każdą sprawę, w której chcemy operować na pełnym kontenerze, prawda? Cóż, niezupełnie. Rozważać
std::for_each(c.rbegin(), c.rend(), foo);
Jeśli chcemy poradzić sobie z operacjami wstecznymi na kontenerach, potrzebujemy innej metody (lub pary metod) dla każdego istniejącego algorytmu.
Tak więc podejście oparte na zakresie jest bardziej ogólne w prostym sensie, że:
- może zrobić wszystko, co może zrobić cała wersja kontenera
- podejście całego kontenera podwaja lub trzykrotnie liczbę wymaganych przeciążeń, a jednocześnie jest mniej mocne
- algorytmy oparte na zakresie są również możliwe do skomponowania (można układać w stosy lub łączyć łańcuchy iteratorów, chociaż jest to częściej wykonywane w językach funkcjonalnych i Pythonie)
Oczywiście istnieje jeszcze jeden ważny powód, który polegał na tym, że standaryzacja STL była już bardzo pracochłonna, a nadmuchiwanie go wygodnymi opakowaniami, zanim został on szeroko użyty, nie byłby świetnym wykorzystaniem ograniczonego czasu komitetu. Jeśli jesteś zainteresowany, możesz znaleźć raport techniczny Stepanova i Lee tutaj
Jak wspomniano w komentarzach, Boost.Range zapewnia nowsze podejście bez konieczności wprowadzania zmian w standardzie.