... definitivamente es útil tener la opción de pasar rangos. Pero al menos en mi experiencia, ese es un caso especial raro. Por lo general, querré operar en contenedores completos
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 ha notado que puede implementar todo el caso del contenedor utilizando la interfaz actual, pero no puede hacer lo contrario.
Entonces, el escritor de la biblioteca tenía la opción de implementar dos interfaces por adelantado, o solo implementar una que todavía cubra todos los casos.
Es fácil escribir una función de contenedor que tome un contenedor y llame a begin () y end (), pero esas funciones de conveniencia no están incluidas en la biblioteca estándar
Es cierto, especialmente porque las funciones gratuitas std::begin
y std::end
ahora están incluidas.
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 functor de comparación, y necesitamos proporcionar los equivalentes para cualquier otro algoritmo.
Pero al menos cubrimos todos los casos en los que queremos operar en un contenedor lleno, ¿verdad? Bueno, no del todo. Considerar
std::for_each(c.rbegin(), c.rend(), foo);
Si queremos manejar el funcionamiento al revés en contenedores, necesitamos otro método (o un par de métodos) por algoritmo existente.
Entonces, el enfoque basado en el rango es más general en el sentido simple de que:
- puede hacer todo lo que puede hacer la versión de contenedor completo
- el enfoque de contenedor completo duplica o triplica el número de sobrecargas requeridas, sin dejar de ser menos potente
- los algoritmos basados en rango también son componibles (puede apilar o encadenar adaptadores iteradores, aunque esto se hace más comúnmente en lenguajes funcionales y Python)
Hay otra razón válida, por supuesto, que es que era ya un montón de trabajo para obtener el STL normalizado, e inflando con envolturas de conveniencia antes de que había sido ampliamente utilizado no sería un gran uso del tiempo comité limitado. Si está interesado, puede encontrar el informe técnico de Stepanov & Lee aquí.
Como se mencionó en los comentarios, Boost.Range proporciona un enfoque más nuevo sin requerir cambios en el estándar.