... es definitivamente útil tener la opción de pasar rangos. Pero al menos en mi experiencia, ese es un caso especial raro. Normalmente querré operar en contenedores enteros
Puede ser un caso especial raro en su experiencia , pero en realidad todo el contenedor es el caso especial, y el rango arbitrario Es el caso general.
Ya te has dado cuenta de que puedes implementar el caso contenedor completo utilizando la interfaz actual, pero no puedes hacer lo contrario.
Por lo tanto, el escritor de la biblioteca pudo elegir entre implementar dos interfaces por adelantado o solo una que aún cubra todos los casos.
Es fácil escribir una función de contenedor que toma un contenedor y las llamadas comienzan () y terminan () en él, pero tales funciones de conveniencia no están incluidas en la biblioteca estándar
Verdadero, especialmente porque ahora se incluyen las funciones gratuitas std::begin
y std::end
.
Entonces, digamos que la biblioteca proporciona la sobrecarga de conveniencia:
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
ahora también debe proporcionar la sobrecarga equivalente tomando un funtor de comparación, y necesitamos proporcionar los equivalentes para todos los demás algoritmos.
Pero al menos cubrimos todos los casos en los que queremos operar en un contenedor lleno, ¿verdad? Bueno, no del todo. Considera
std::for_each(c.rbegin(), c.rend(), foo);
Si queremos manejar el funcionamiento de al revés en contenedores, necesitamos otro método (o par de métodos) por algoritmo existente.
Por lo tanto, el enfoque basado en el rango es más general en el sentido simple de que:
- puede hacer todo lo que la versión de contenedor completo puede
- el enfoque de todo el contenedor duplica o triplica el número de sobrecargas requeridas, mientras que sigue siendo menos poderoso
- los algoritmos basados en rango también se pueden componer (puede apilar o encadenar adaptadores de iterador, aunque esto se hace más comúnmente en lenguajes funcionales y en Python)
Hay otra razón válida, por supuesto, que es ya mucho trabajo para estandarizar el STL, e inflarlo con envoltorios de conveniencia antes de que se haya utilizado ampliamente no sería un gran uso del tiempo limitado del comité. Si estás interesado, puedes encontrar Stepanov & El informe técnico de Lee aquí
Como se menciona en los comentarios, Boost.Range proporciona un enfoque más nuevo sin requerir cambios en el estándar.