... безусловно, полезно иметь возможность проходить диапазоны. Но, по крайней мере, по моему опыту, это редкий особый случай. Я обычно хочу работать с целыми контейнерами
В вашем случае это может быть редкий особый случай , но на самом деле весь контейнер - это особый случай, а произвольный диапазон - это общий случай.
Вы уже заметили, что можете реализовать весь контейнерный случай, используя текущий интерфейс, но вы не можете сделать обратное.
Таким образом, у создателя библиотеки был выбор между реализацией двух интерфейсов заранее или только реализацией одного, который все еще охватывает все случаи.
Легко написать функцию-обертку, которая принимает контейнер и вызывает на нем begin () и end (), но такие вспомогательные функции не включены в стандартную библиотеку
Правда, тем более что бесплатные функции std::begin
и std::end
сейчас включены.
Итак, допустим, библиотека обеспечивает перегрузку удобства:
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
теперь он также должен обеспечить эквивалентную перегрузку, принимая функтор сравнения, и нам нужно предоставить эквиваленты для любого другого алгоритма.
Но мы по крайней мере рассмотрели каждый случай, когда мы хотим работать с полным контейнером, верно? Ну, не совсем. Рассмотреть возможность
std::for_each(c.rbegin(), c.rend(), foo);
Если мы хотим работать с контейнерами в обратном направлении , нам нужен другой метод (или пара методов) для каждого существующего алгоритма.
Таким образом, основанный на диапазоне подход является более общим в простом смысле:
- он может делать все, что может версия целого контейнера
- подход с использованием целых контейнеров удваивает или утраивает количество требуемых перегрузок, оставаясь при этом менее мощным
- основанные на диапазоне алгоритмы также можно компоновать (вы можете использовать адаптеры итераторов в стеке или в цепочке, хотя чаще это делается на функциональных языках и Python)
Конечно, есть еще одна веская причина, заключающаяся в том, что для стандартизации STL было уже очень много работы, и накачка его удобными обертками до того, как он стал широко использоваться, не будет большим использованием ограниченного времени для комитетов. Если вы заинтересованы, вы можете найти технический отчет Stepanov & Lee здесь
Как уже упоминалось в комментариях, Boost.Range предоставляет новый подход, не требуя изменений в стандарте.