Namespaces
Variants

std::forward_list<T,Allocator>:: sort

From cppreference.net

void sort ( ) ;
(1) (начиная с C++11)
(constexpr начиная с C++26)
template < class Compare >
void sort ( Compare comp ) ;
(2) (начиная с C++11)
(constexpr начиная с C++26)

Сортирует элементы и сохраняет порядок эквивалентных элементов. Если возникает исключение, порядок элементов в * this не определён.

1) Элементы сравниваются с помощью operator < .
2) Элементы сравниваются с использованием comp .

Никакие ссылки или итераторы не становятся недействительными.

Содержание

Параметры

comp - объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare ), который возвращает ​ true если первый аргумент меньше второго (т.е. упорядочен перед вторым).

Сигнатура функции сравнения должна быть эквивалентна следующей:

bool cmp ( const Type1 & a, const Type2 & b ) ;

Хотя сигнатура не обязана содержать const & , функция не должна модифицировать передаваемые ей объекты и должна быть способна принимать все значения типов (возможно const) Type1 и Type2 независимо от категории значения (следовательно, Type1& не допускается , как и Type1 , если для Type1 перемещение не эквивалентно копированию (since C++11) ).
Типы Type1 и Type2 должны быть такими, чтобы объект типа forward_list < T,Allocator > :: const_iterator мог быть разыменован и затем неявно преобразован к обоим из них. ​

Требования к типам
-
Compare должен удовлетворять требованиям Compare .

Сложность

Дано N как std:: distance ( begin ( ) , end ( ) ) :

1) Приблизительно N·log(N) сравнений с использованием operator < .
2) Приблизительно N·log(N) применений функции сравнения comp .

Примечания

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

Пример

#include <functional>
#include <iostream>
#include <forward_list>
std::ostream& operator<<(std::ostream& ostr, const std::forward_list<int>& list)
{
    for (const int i : list)
        ostr << ' ' << i;
    return ostr;
}
int main()
{
    std::forward_list<int> list{8, 7, 5, 9, 0, 1, 3, 2, 6, 4};
    std::cout << "initially: " << list << '\n';
    list.sort();
    std::cout << "ascending: " << list << '\n';
    list.sort(std::greater<int>());
    std::cout << "descending:" << list << '\n';
}

Вывод:

initially:  8 7 5 9 0 1 3 2 6 4
ascending:  0 1 2 3 4 5 6 7 8 9
descending: 9 8 7 6 5 4 3 2 1 0

Смотрите также

изменяет порядок элементов на обратный
(публичная функция-член)