名前空間
変種
操作

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

From cppreference.com
< cpp‎ | container‎ | list
 
 
 
 
void sort();
(1)
template< class Compare >
void sort( Compare comp );
(2)

要素をソートし、同値な要素の順序を保持します。参照やイテレータは無効になりません。

1) 要素は operator< を使って比較されます。
2) 要素は comp を使って比較されます。

例外がスローされた場合、*this の要素の順序は未規定です。

目次

[編集] パラメータ

comp - 比較関数オブジェクト(つまり、Compare の要件を満たすオブジェクト)。最初の引数が2番目の引数より小さい(つまり、前に順序付けられる)場合に true を返します。

比較関数のシグネチャは、以下と同等でなければならない。

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

シグネチャは const& を持つ必要はありませんが、関数は渡されたオブジェクトを変更してはならず、値カテゴリ に関係なく、(おそらく const の) Type1Type2 のすべての値を受け入れられる必要があります (したがって、Type1& は許可されません。また、Type1 のムーブがコピーと同等でない限り、Type1 も許可されません(C++11以降))。
Type1Type2 は、list<T,Allocator>::const_iterator 型のオブジェクトを逆参照してから、それらに暗黙的に変換できる型でなければなりません。​

型要件
-
CompareCompareの要件を満たす必要がある。

[編集] 戻り値

(なし)

[編集] 計算量

Nthis->size() とします。

1) operator< を使用した比較は、およそ N·log(N) 回です。
2) 比較関数 comp の適用は、およそ N·log(N) 回です。

[編集] 注釈

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 イテレータや参照が無効になるかどうか不明でした 有効のまま

[編集] 関連項目

要素の順序を反転する
(public member function) [編集]
English 日本語 中文(简体) 中文(繁體)