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 の要件を満たすオブジェクト)。最初の引数が2番目の引数より 小さい (つまり 前に順序付けられる )場合に​ true を返す。

比較関数のシグネチャは以下と同等であるべき:

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

シグネチャが const & を持つ必要はないが、関数は渡されたオブジェクトを変更してはならず、 値カテゴリ に関係なく型(おそらくconstの) Type1 Type2 のすべての値を受け入れられなければならない(したがって Type1& は許可されない Type1 も同様に、 Type1 に対してムーブがコピーと等価でない限り許可されない (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

関連項目

要素の順序を反転する
(公開メンバ関数)