... il est certainement utile d'avoir la possibilité de passer des plages. Mais au moins d'après mon expérience, c'est un cas spécial rare. Je veux généralement opérer sur des conteneurs entiers
Selon votre expérience , il s’agit peut-être d’un cas rare , mais en réalité, le conteneur dans son ensemble constitue le cas particulier et la plage arbitraire le cas général.
Vous avez déjà remarqué que vous pouvez implémenter l' intégralité du conteneur en utilisant l'interface actuelle, mais vous ne pouvez pas faire l'inverse.
Ainsi, le bibliothécaire-rédacteur avait le choix entre implémenter deux interfaces à l’avance ou n’en implémenter qu’une seule qui couvre toujours tous les cas.
Il est facile d'écrire une fonction wrapper qui prend un conteneur et appelle les commandes begin () et end (), mais ces fonctions ne sont pas incluses dans la bibliothèque standard.
C'est vrai, d'autant plus que les fonctions libres std::begin
et std::end
sont maintenant incluses.
Donc, disons que la bibliothèque fournit la surcharge de commodité:
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
maintenant, il doit également fournir la surcharge équivalente en prenant un foncteur de comparaison, et nous devons fournir les équivalents pour tout autre algorithme.
Mais nous avons au moins couvert tous les cas où nous souhaitons opérer avec un conteneur complet, non? Pas tout à fait. Considérer
std::for_each(c.rbegin(), c.rend(), foo);
Si nous voulons gérer les opérations en arrière sur les conteneurs, nous avons besoin d' une autre méthode (ou d'une paire de méthodes) par algorithme existant.
L’approche basée sur la plage est donc plus générale dans le sens simple qui suit:
- il peut tout faire de la version contenant entier
- l'approche globale du conteneur double ou triple le nombre de surcharges requises, tout en restant moins puissante
- les algorithmes basés sur les plages sont également composables (vous pouvez empiler ou chaîner des adaptateurs d'itérateur, bien que cela se fasse plus couramment dans les langages fonctionnels et en Python)
Bien sûr, il existe une autre raison valable, à savoir que la standardisation du STL nécessitait déjà beaucoup de travail et que le gonfler avec des enveloppes de commodité avant qu'il ne soit largement utilisé ne serait pas une grande utilisation du temps limité des comités. Si vous êtes intéressé, vous trouverez le rapport technique de Stepanov & Lee ici
Comme mentionné dans les commentaires, Boost.Range fournit une approche plus récente sans nécessiter de modification de la norme.