Namespaces
Variants

std::qsort

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲に対するアルゴリズム (C++20)
制約付きアルゴリズム、例 ranges::copy、ranges::sort、...
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割済み範囲に対して)
集合操作 (ソート済み範囲に対して)
マージ操作 (ソート済み範囲に対して)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
ヘッダ <cstdlib>
void qsort( void *ptr, std::size_t count,
            std::size_t size, /* c-compare-pred */* comp );
void qsort( void *ptr, std::size_t count,
            std::size_t size, /* compare-pred */* comp );
(1)
extern "C" using /* c-compare-pred */ = int(const void*, const void*);
extern "C++" using /* compare-pred */ = int(const void*, const void*);
(2) (説明専用*)

ptr が指す配列を昇順にソートします。配列は count 個の要素を含み、各要素は size バイトです。オブジェクトの比較には comp が指す関数が使用されます。

comp が2つの要素を同等と示した場合、それらの順序は未規定です。

配列の要素の型が PODType(C++11 まで)TriviallyCopyable 型(C++11 以降) でない場合、動作は未定義です。

引数

ptr - ソートする配列へのポインタ
count - 配列の要素数
size - 配列の各要素のバイト単位のサイズ
comp - 比較関数。第1引数が第2引数より小さい場合は負の整数値、第1引数が第2引数より大きい場合は正の整数値、そして引数が同等の場合は0を返します。

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

int cmp(const void *a, const void *b);

関数は渡されたオブジェクトを変更してはならず、同じオブジェクトに対して呼び出された場合、配列内の位置に関係なく一貫した結果を返さなければなりません。

​

戻り値

(なし)

ノート

名称にかかわらず、C++、C、およびPOSIX標準はこの関数がクイックソートを使って実装されることや、計算量や安定性の保証を要求していません。

C++標準ライブラリが提供する2つのオーバーロードは、引数 comp の型が異なるため (言語リンケージは型の一部です)、区別されます。

例

以下のコードは qsort() を使って整数の配列をソートします:

#include <array>
#include <climits>
#include <compare>
#include <cstdlib>
#include <iostream>

int main()
{
    std::array a{-2, 99, 0, -743, INT_MAX, 2, INT_MIN, 4};
    
    std::qsort
    (
        a.data(),
        a.size(),
        sizeof(decltype(a)::value_type),
        [](const void* x, const void* y)
        {
            const int arg1 = *static_cast<const int*>(x);
            const int arg2 = *static_cast<const int*>(y);
            const auto cmp = arg1 <=> arg2;
            if (cmp < 0)
                return -1;
            if (cmp > 0)
                return 1;
            return 0;
        }
    );
    
    for (int ai : a)
        std::cout << ai << ' ';
    std::cout << '\n';
}

出力:

-2147483648 -743 -2 0 2 4 99 2147483647

欠陥報告

以下の動作を変更する欠陥報告は、以前に公開されたC++標準に遡って適用されました。

DR 適用先 公開された動作 正しい動作
LWG 405 C++98 配列の要素は任意の型であってもよかった PODType

に制限された関連項目

不特定の型の要素を配列から検索する
(関数)
要素の範囲をソートする
(関数テンプレート & アルゴリズム関数オブジェクト)
(C++11)(C++26 で非推奨)
型がトリビアルかどうか調べる
(クラステンプレート)