std::sort
требует произвольного доступа итераторов, которые std::list
не предоставляет. Следовательно, std::list
и std::forward_list
реализуют свои собственные функции-члены для сортировки, которые работают со своими более слабыми итераторами. Гарантии сложности этих функций-членов хуже, чем у более эффективного общего алгоритма. [К сожалению: см. Комментарии.]
Более того, функции-члены могут воспользоваться преимуществом особого характера структуры данных списка, просто перекомпоновав узлы списка, в то время как стандартный алгоритм должен выполнить что-то вроде swap
(или что-то в этом роде), что требует объекта строительство, назначение и удаление.
Обратите внимание, что remove()
является аналогичным случаем: стандартный алгоритм представляет собой просто некоторую перестановку, возвращающую итератор, тогда как функция-член list
выполняет поиск и фактическое удаление всего за один раз; снова благодаря возможности воспользоваться знанием внутренней структуры списка.