2017-02-22 41 views
1

При сортировке вектор в C++ можно использовать STL, как:Почему нет станд :: сортировать (вектор <T> &)

std::sort(vec.begin(), vec.end()); 

Поскольку это очень общее использование (т.е. обеспечение начала и конца итератора) Я Интересно, почему нет рода перегрузки, которая будет принимать ссылку на вектор, например:

template <typename T> 
void sort(vector<T>& vec) 
{ 
    std::sort(vec.begin(), vec.end()); 
} 
+2

Возможно, потому что они должны были определить один для каждого контейнера. Скорее всего, это будет 'T & vec' не' vector & vec' для работы с любым контейнером. – immibis

+3

Это часть из диапазонов TS, который имеет концепцию «Range», которую он может использовать для ограничения типов, которые вы можете сортировать. В этом случае на самом деле имеет концепцию «Sortable», которая имеет некоторые дополнительные требования к простому «диапазону». – chris

+2

функция не будет работать с моим 'vector ' .Boo. –

ответ

1

текущий дизайн стандартной библиотеки, которая расщепляет в алгоритмы, структуры данных и итераторы имеют некоторые очень хорошие концептуальные последствия: алгоритмы работают только на итераторах, никогда на контейнерах. Это означает, что алгоритмы сами по себе не могут аннулировать итераторы, и вся нетерация итератора происходит через модификацию контейнера, которая должна быть сделана явно.

Это, например, почему для удаления-стирания требуются два компонента: неинвалинирующая перегруппировка последовательности, за которой следует операция контейнера для сжатия контейнера.

Кроме того, не все диапазоны исходят из контейнеров, поэтому выражения алгоритмов с точки зрения итераторов ближе по духу к использованию абстрактных «диапазонов», чем к конкретным вещам, которые содержат диапазоны.

И, конечно, есть исходный аргумент сложности: Выражая как алгоритмы и контейнеры с точкой зрения итераторов, библиотека требует O (М + N) компоненты, где М является количеством алгоритмов и N количество контейнеров, тогда как если бы у вас был один алгоритм на контейнер, вам понадобятся компоненты O (MN). Да, вы можете использовать шаблоны, но полностью неограниченные шаблоны (например, template <typename T> void sort(T&) имеют нелокальные последствия, а сдерживающие шаблоны жесткие и тонкие (например, подсчитайте волосы любому, кто когда-либо работал с enable_if, или сталкивались со своими пользователями или пытались добавьте «понятия» в C++).

Смежные вопросы