Как уже было сказано, стандартная библиотека предоставляет шаблон функции без членов, который может сортировать любой диапазон по паре итераторов произвольного доступа.
Было бы совершенно избыточно иметь функцию-член для сортировки вектора.Следующие значения будут иметь то же значение:
std::sort(v.begin(), v.end());
v.sort();
Один из первых принципов STL состоит в том, что алгоритмы не связаны с контейнерами.То, как данные хранятся и как ими манипулируют, должно быть как можно слабее связанным.
Итераторы используются в качестве интерфейса между контейнерами (которые хранят данные) и алгоритмами (которые работают с данными).Таким образом, вы можете написать алгоритм один раз, и он может работать с контейнерами различных типов, и если вы пишете новый контейнер, существующие универсальные алгоритмы могут использоваться для манипулирования его содержимым.
Причина, по которой std::list
предоставляет свою собственную функцию sort
, поскольку функция-член состоит в том, что она не является произвольно доступным контейнером;он предоставляет только двунаправленные итераторы (поскольку он предназначен для представления двусвязного списка, это имеет смысл).Для общей функции std::sort
требуются итераторы с произвольным доступом, поэтому ее нельзя использовать с std::list
.std::list
предоставляет свою собственную функцию sort
, чтобы ее можно было отсортировать.
Как правило, в двух случаях контейнер должен реализовывать алгоритм:
Если универсальный алгоритм не может работать с контейнером, но существует другой, зависящий от контейнера алгоритм, который может обеспечить те же функции, что и в случае с std::list::sort
.
Если контейнер может обеспечить конкретную реализацию алгоритма, которая более эффективна, чем универсальный алгоритм, как в случае с std::map::find
, который позволяет найти элемент на карте в логарифмическом времени (универсальный алгоритм std::find
выполняетлинейный поиск, потому что он не может предположить, что диапазон отсортирован).