... é definitivamente útil ter a opção de passar intervalos. Mas pelo menos na minha experiência, esse é um caso especial raro. Normalmente, eu quero operar em contêineres inteiros
Pode ser um caso especial raro em sua experiência , mas, na realidade, todo o contêiner é o caso especial e o intervalo arbitrário é o caso geral.
Você já percebeu que é possível implementar todo o caso do contêiner usando a interface atual, mas não pode fazer o inverso.
Portanto, o escritor da biblioteca teve a opção de implementar duas interfaces antecipadamente ou apenas uma que ainda abrange todos os casos.
É fácil escrever uma função de invólucro que pega um contêiner e chama begin () e end () nele, mas essas funções de conveniência não estão incluídas na biblioteca padrão
Verdade, especialmente desde as funções gratuitas std::begin
e std::end
agora estão incluídas.
Então, digamos que a biblioteca ofereç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 exatamente. Considerar
std::for_each(c.rbegin(), c.rend(), foo);
Se queremos lidar com a operação reversa em contêineres, precisamos de outro método (ou par de métodos) por algoritmo existente.
Portanto, a abordagem baseada em faixa é mais geral no sentido simples de que:
- ele pode fazer tudo o que a versão do contêiner inteiro pode
- a abordagem de todo o contêiner duplica ou triplica o número de sobrecargas necessárias, enquanto ainda é menos poderosa
- 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)
Há outro motivo válido, é claro, que já era muito trabalhoso padronizar o STL e inflá-lo com invólucros de conveniência antes que ele fosse amplamente utilizado não seria um ótimo uso do tempo limitado do comitê. Se você estiver interessado, pode encontrar o relatório técnico de Stepanov & Lee aqui
Conforme mencionado nos comentários, o Boost.Range fornece uma abordagem mais nova sem exigir alterações no padrão.