std::qsort
From cppreference.com
| ヘッダ <cstdlib> で定義 |
||
| 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で非推奨) |
型がトリビアルであるかをチェックする (クラステンプレート) |
| C言語のドキュメント (qsort)
| |