... è sicuramente utile avere la possibilità di passare intervalli. Ma almeno nella mia esperienza, è un caso speciale raro. Di solito vorrei operare su interi contenitori
Potrebbe trattarsi di un raro caso speciale nella tua esperienza , ma in realtà l' intero contenitore è il caso speciale e l' intervallo arbitrario è il caso generale.
Hai già notato che puoi implementare l' intera custodia del contenitore utilizzando l'interfaccia corrente, ma non puoi fare il contrario.
Quindi, lo scrittore di biblioteche poteva scegliere tra l'implementazione di due interfacce in anticipo, o solo l'implementazione di una che copre ancora tutti i casi.
È facile scrivere una funzione wrapper che accetta un contenitore e chiama da inizio () e fine (), ma tali funzioni di convenienza non sono incluse nella libreria standard
Vero, soprattutto perché le funzioni gratuite std::begin
e std::end
ora sono incluse.
Quindi, supponiamo che la libreria fornisca il sovraccarico di convenienza:
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
ora deve anche fornire il sovraccarico equivalente prendendo un funzione di confronto e dobbiamo fornire gli equivalenti per ogni altro algoritmo.
Ma almeno abbiamo coperto tutti i casi in cui vogliamo operare su un contenitore pieno, giusto? Bene, non proprio. Tener conto di
std::for_each(c.rbegin(), c.rend(), foo);
Se vogliamo gestire il funzionamento all'indietro sui container, abbiamo bisogno di un altro metodo (o coppia di metodi) per algoritmo esistente.
Quindi, l'approccio basato sul range è più generale nel senso semplice che:
- può fare tutto ciò che può fare la versione dell'intero contenitore
- l'approccio dell'intero contenitore raddoppia o triplica il numero di sovraccarichi richiesti, pur essendo meno potente
- gli algoritmi basati su intervallo sono anche componibili (è possibile impilare o concatenare adattatori iteratori, sebbene ciò sia più comunemente fatto in linguaggi funzionali e Python)
C'è un'altra ragione valida, ovviamente, che è che era già molto lavoro per standardizzare la STL, e gonfiarla con involucri di comodo prima che fosse ampiamente usata non sarebbe un grande uso del tempo limitato del comitato. Se sei interessato, puoi trovare il rapporto tecnico di Stepanov & Lee qui
Come menzionato nei commenti, Boost.Range offre un approccio più recente senza richiedere modifiche allo standard.