qsort, qsort_s
From cppreference.com
| ヘッダー <stdlib.h> で定義 |
||
| (1) | ||
| errno_t qsort_s( void* ptr, rsize_t count, rsize_t size, int (*comp)(const void*, const void*, void*), |
(2) | (C11 以降) |
1) ptr が指す配列を昇順にソートします。配列には size バイトの count 個の要素が含まれています。comp が指す関数はオブジェクトの比較に使用されます。
2) (1) と同じですが、追加のコンテキストパラメータ context が comp に渡され、以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数が呼び出されます。
- count または size が RSIZE_MAX より大きい場合
- ptr または comp がヌルポインタの場合 (count がゼロの場合を除く)
- すべての境界チェック関数と同様に、`qsort_s` は、実装によって __STDC_LIB_EXT1__ が定義され、かつユーザーが <stdlib.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ利用可能であることが保証されています。
comp が2つの要素を同等であると示す場合、結果として得られるソートされた配列でのそれらの順序は未指定です。
目次 |
[編集] パラメータ
| ptr | - | ソートする配列へのポインタ |
| count | - | 配列内の要素数 |
| size | - | 配列内の各要素のバイト単位のサイズ |
| comp | - | 最初の引数が2番目の引数より*小さい*場合は負の整数値、最初の引数が2番目の引数より*大きい*場合は正の整数値、引数が同等であればゼロを返す比較関数。 比較関数のシグネチャは、以下と同等でなければならない。 int cmp(const void *a, const void *b); この関数は、渡されたオブジェクトを変更してはならず、同じオブジェクトに対して呼び出された場合、配列内の位置に関係なく一貫した結果を返さなければなりません。 |
| context | - | 追加情報 (例: 照合順序)。comp の3番目の引数として渡されます。 |
[編集] 戻り値
1) (なし)
2) 成功した場合はゼロ、実行時制約違反が検出された場合はゼロ以外
[編集] 備考
名前にもかかわらず、C規格もPOSIX規格も、この関数がクイックソートを使用して実装されることを要求しておらず、複雑さや安定性の保証もしていません。
他の境界チェック関数とは異なり、`qsort_s` はサイズゼロの配列を実行時制約違反として扱わず、代わりに配列を変更せずに正常に終了します(サイズゼロの配列を受け入れるもう1つの関数は bsearch_s です)。
Windows CRT における `qsort_s` の実装は C 標準と互換性がありません。Microsoft のバージョンは次のように宣言されています: void qsort_s(void *base, size_t num, size_t width,
int (*compare )(void *, const void *, const void *), void * context);。値を返さず、比較関数は標準とは引数の順序が逆になっています。context が最初に渡されます。
[編集] 例
このコードを実行
#include <limits.h> #include <stdio.h> #include <stdlib.h> int compare_ints(const void* a, const void* b) { int arg1 = *(const int*)a; int arg2 = *(const int*)b; if (arg1 < arg2) return -1; if (arg1 > arg2) return 1; return 0; // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut // return arg1 - arg2; // erroneous shortcut: undefined behavior in case of // integer overflow, such as with INT_MIN here } int main(void) { int ints[] = {-2, 99, 0, -743, 2, INT_MIN, 4}; int size = sizeof ints / sizeof *ints; qsort(ints, size, sizeof(int), compare_ints); for (int i = 0; i < size; i++) printf("%d ", ints[i]); printf("\n"); }
出力
-2147483648 -743 -2 0 2 4 99
[編集] 参照
- C23標準 (ISO/IEC 9899:2024)
- 7.22.5.2 qsort関数 (p: TBD)
- K.3.6.3.2 qsort_s関数 (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 7.22.5.2 qsort関数 (p: 258-259)
- K.3.6.3.2 qsort_s関数 (p: 442-443)
- C11標準 (ISO/IEC 9899:2011)
- 7.22.5.2 qsort関数 (p: 355-356)
- K.3.6.3.2 qsort_s関数 (p: 609)
- C99標準 (ISO/IEC 9899:1999)
- 7.20.5.2 qsort関数 (p: 319)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.10.5.2 qsort関数
[編集] 関連項目
| (C11) |
型が指定されていない要素を配列から検索する (関数) |
| qsort のC++ドキュメント
| |