текущий дизайн стандартной библиотеки, которая расщепляет в алгоритмы, структуры данных и итераторы имеют некоторые очень хорошие концептуальные последствия: алгоритмы работают только на итераторах, никогда на контейнерах. Это означает, что алгоритмы сами по себе не могут аннулировать итераторы, и вся нетерация итератора происходит через модификацию контейнера, которая должна быть сделана явно.
Это, например, почему для удаления-стирания требуются два компонента: неинвалинирующая перегруппировка последовательности, за которой следует операция контейнера для сжатия контейнера.
Кроме того, не все диапазоны исходят из контейнеров, поэтому выражения алгоритмов с точки зрения итераторов ближе по духу к использованию абстрактных «диапазонов», чем к конкретным вещам, которые содержат диапазоны.
И, конечно, есть исходный аргумент сложности: Выражая как алгоритмы и контейнеры с точкой зрения итераторов, библиотека требует O (М + N) компоненты, где М является количеством алгоритмов и N количество контейнеров, тогда как если бы у вас был один алгоритм на контейнер, вам понадобятся компоненты O (MN). Да, вы можете использовать шаблоны, но полностью неограниченные шаблоны (например, template <typename T> void sort(T&)
имеют нелокальные последствия, а сдерживающие шаблоны жесткие и тонкие (например, подсчитайте волосы любому, кто когда-либо работал с enable_if
, или сталкивались со своими пользователями или пытались добавьте «понятия» в C++).
Возможно, потому что они должны были определить один для каждого контейнера. Скорее всего, это будет 'T & vec' не' vector & vec' для работы с любым контейнером. –
immibis
Это часть из диапазонов TS, который имеет концепцию «Range», которую он может использовать для ограничения типов, которые вы можете сортировать. В этом случае на самом деле имеет концепцию «Sortable», которая имеет некоторые дополнительные требования к простому «диапазону». – chris
функция не будет работать с моим 'vector' .Boo. –