... напевно корисно мати можливість проходження діапазонів. Але, принаймні, з мого досвіду, це рідкісний особливий випадок. Зазвичай я хочу оперувати цілими контейнерами
Це може бути рідкісним особливим випадком у вашому досвіді , але насправді весь контейнер - це особливий випадок, а довільний діапазон - загальний випадок.
Ви вже помітили, що ви можете реалізувати весь корпус контейнера за допомогою поточного інтерфейсу, але не можете зробити зворотне.
Отже, у бібліотечного письменника був вибір між реалізацією двох інтерфейсів на передній частині, або лише тим, хто реалізує, який все ще охоплює всі випадки.
Легко написати функцію обгортки, яка бере контейнер і викликає на ньому запуск () і закінчення (), але такі зручні функції не включені до стандартної бібліотеки
Правда, тим більше, що безкоштовні функції 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 забезпечує новіший підхід, не вимагаючи змін до стандарту.