Namespaces
Variants

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

From cppreference.net

void sort ( ) ;
(1) (constexpr since C++26)
template < class Compare >
void sort ( Compare comp ) ;
(2) (constexpr since 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 は、 list < T,Allocator > :: const_iterator 型のオブジェクトが間接参照され、その後両方の型に暗黙的に変換可能である必要があります。 ​

型要件
-
Compare Compare の要件を満たさなければなりません。

計算量

与えられた N size() として:

1) N·log(N) 回の比較を operator < を使用して行う。
2) およそ N·log(N) 回の比較関数 comp の適用。

注記

std::sort はランダムアクセスイテレータを必要とするため、 list では使用できません。この関数はまた、 std::sort とは異なり、 list の要素型が交換可能である必要がなく、すべてのイテレータの値を保持し、安定ソートを実行します。

#include <functional>
#include <iostream>
#include <list>
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
    for (const int i : list)
        ostr << ' ' << i;
    return ostr;
}
int main()
{
    std::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

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 1207 C++98 イテレータおよび/または参照が無効化されるかどうかが不明確であった 有効を維持

関連項目

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