名前空間
変種
操作

std::qsort

From cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
パーティション操作
ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
qsort
数値演算
未初期化メモリに対する操作
 
ヘッダ <cstdlib> で定義
void qsort( void *ptr, std::size_t count,

            std::size_t size, /* C言語における比較関数 */* comp );
void qsort( void *ptr, std::size_t count,

            std::size_t size, /* C++言語における比較関数 */* comp );
(1)
extern "C" using /* C言語における比較関数 */ = int(const void*, const void*);
extern "C++" using /* C++言語における比較関数 */ = int(const void*, const void*);
(2) (説明用*)

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

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

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

目次

[編集] パラメータ

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

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

 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で非推奨)
型がトリビアルであるかをチェックする
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)