Почему нет сорта (v) в С++?

Я всегда задавался вопросом, почему нет

sort(v);// same as std::sort(v.begin(),v.end())

Если я правильно помню давно, я увидел клик boostcon, где говорящий сказал, что для этого требуются концепции, но я не понимаю, почему. BTW Я попробовал это (в VS 11), и он работает niceli из того, что я вижу.

template <typename Container>
void sortfx(Container& c)
{
    std::sort(c.begin(),c.end());
}
int main()
{

    std::vector<double> v;
    //std::list<double> v; this causes compile errors
    v.push_back(1701);
    v.push_back(1729);
    v.push_back(74656);
    v.push_back(2063);
    sortfx(v);
    assert(std::is_sorted(begin(v),end(v)));

}

EDIT: Сам Бьярн объясняет понятия, вроде как пример:) https://www.informit.com/articles/article.aspx?p=2080042&WT.rss_f=Article&WT.rss_a=An%20Interview%20with%20Bjarne%20Stroustrup&WT.rss_ev=a

Ответ 1

Это не расширение std::sort(v)std::sort(v.begin(), v.end()), которое потребует понятий, но альтернативная функция сортировки принимает дополнительный параметр для сравнения - std::sort(v.begin(), v.end(), compare).

Если у вас есть вызов std::sort(v, compare), для реализации потребуются концепции, чтобы отличить его от std::sort(start, end) для неконтейнера.

Заголовок <algorithm> заполнен шаблонами с такой проблемой.

Ответ 2

Из Стандарт обучения С++ как новый язык (PDF) Журнал Stroustrup, C/С++. pp. 43-54. Май 1999 года:

Обычная сортировка (v) была бы проще в этом случае, но иногда мы хотим сортировать часть контейнер, поэтому он более общий, чтобы указать начало и конец того, что мы хотим отсортировать.

Это имеет смысл для меня. Это тривиально, чтобы создать обертку, как вы продемонстрировали, и это не очень громоздко использовать без обертки. Наличие второго sort(), которое взяло Контейнер, просто не похоже на это.

Ответ 3

<algorithm> функции непосредственно не работают с контейнером. Они взаимодействуют только с итераторами, без какого-либо контекстного знания контейнера. Я не вижу вреда, если вы используете короткую полноразмерную нотацию для своей цели, но вы должны предположить, что у объекта есть интерфейс begin/end, который также является двунаправленным итератором.

Ответ 4

В этом нет ничего, что требовало бы концепций. Диапазоны не сложнее, чем итераторы.

Ответ 5

Что делать, если вы хотите только отсортировать подмножество контейнера?

Я недавно опубликовал аналогичный вопрос о том, почему for_each не является функцией-членом Container вместо автономности. т.е. v.for_each([&sum] (int i) { sum += i; });

Ответ 6

Для этого не требуются понятия, но (поскольку они были предложены во время стандартизации С++ 11), было бы довольно легко реализовать это.

Как сейчас, вы можете сделать это, предоставив пару дополнительных перегрузок (или, возможно, явных специальностей) для std::sort. Проблема, конечно, в том, что std::sort не единственный алгоритм, поэтому вы, несомненно, захотите сделать то же самое для многих других алгоритмов (почти все они, скорее всего).

Понятия (в частности, карты концепций, если используется память) предоставили бы довольно чистый способ обеспечить (эквивалент) всех этих перегрузок относительно централизованным образом, поэтому у вас есть все эти адаптеры в одном месте вместо N места (по одному для каждого алгоритма). Еще лучше, если они соответствуют нормальным соглашениям, они будут работать и для других алгоритмов.

Довольно немногие люди в настоящее время считают, что диапазоны - это то, как это нужно обрабатывать - эти алгоритмы должны работать на диапазонах, и любой контейнер должен определять диапазон (но также должны быть другие способы определения диапазонов). Хотя это, вероятно, хорошо, как общая идея, мне кажется (по крайней мере, мне), что существует довольно много разногласий по поводу точных деталей того, что должно составлять диапазон, как они должны определяться и т.д.

Если вы действительно хотите изучить это, Boost уже имеет диапазонную библиотеку, которая включает в себя версии на основе большинства стандартных алгоритмов (и ряд других). По крайней мере, если память используется, это включает в себя некоторые адаптеры для создания диапазона из контейнера, поэтому такие вещи, как sort(c), будут работать без необходимости явно указывать диапазон или итераторы.