std::qsort
ja.cppreference.net より
| ヘッダ <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を返します。 比較関数のシグネチャは以下と同等であるべきです:
関数は渡されたオブジェクトを変更してはならず、同じオブジェクトに対して呼び出された場合、配列内の位置に関係なく一貫した結果を返さなければなりません。 |
戻り値
(なし)
ノート
名称にかかわらず、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++20) |
|
(C++11)(C++26 で非推奨) |
型がトリビアルかどうか調べる (クラステンプレート) |
C ドキュメント for qsort
| |