... it's definitely useful to have the option of passing ranges. But at least in my experience, that's a rare special case. I'll usually want to operate on whole containers
Pode ser um caso especial raro em sua experiência , mas na realidade o recipiente inteiro é o caso especial, e o intervalo arbitrário é o caso geral.
Você já percebeu que é possível implementar o caso recipiente inteiro usando a interface atual, mas não pode fazer o inverso.
Assim, o criador de bibliotecas tinha a opção de implementar duas interfaces iniciais ou apenas implementar uma que ainda abrangesse todos os casos.
It's easy to write a wrapper function which takes a container and calls begin() and end() on it, but such convenience functions are not included in the standard library
Verdade, especialmente porque as funções gratuitas std::begin
e std::end
estão agora incluídas.
Então, digamos que a biblioteca forneça a sobrecarga de conveniência:
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
agora ele também precisa fornecer a sobrecarga equivalente usando um functor de comparação, e precisamos fornecer os equivalentes para todos os outros algoritmos.
Mas, pelo menos, cobrimos todos os casos em que queremos operar em um contêiner cheio, certo? Bem, não é bem assim. Considere
std::for_each(c.rbegin(), c.rend(), foo);
Se quisermos operar para trás em containers, precisamos de outro método (ou par de métodos) por algoritmo existente.
Assim, a abordagem baseada em intervalos é mais geral no sentido simples de que:
- pode fazer tudo o que a versão de contêiner inteiro pode
- a abordagem de todo o contêiner duplica ou triplica o número de sobrecargas necessárias, embora ainda seja menos eficiente
- os algoritmos baseados em intervalo também são compostos (você pode empilhar ou encadear adaptadores de iteradores, embora isso seja mais comumente feito em linguagens funcionais e Python)
Existe outro motivo válido, é claro, que já era muito trabalho para obter o STL padronizado, e inflá-lo com invólucros de conveniência antes de ter sido amplamente usado não seria um grande uso do tempo limitado da comissão. Se você estiver interessado, você pode encontrar Stepanov & O relatório técnico de Lee aqui
Como mencionado nos comentários, o Boost.Range fornece uma abordagem mais recente sem exigir mudanças no padrão.