qsort, qsort_s
提供: 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 | - | 第1引数が第2引数より小さい場合は負の整数値、第1引数が第2引数より大きい場合は正の整数値、第1引数と第2引数が同等な場合はゼロを返す比較関数。 比較関数のシグネチャは以下と同等であるべきです。 int cmp(const void *a, const void *b); 関数は渡されたオブジェクトを変更してはならず、同じオブジェクトに対してはその配列内の位置にかかわらず一貫した結果を返さなければなりません。 |
context | - | comp に第3引数として渡される追加の情報 (照合シーケンスなど)
|
[編集] 戻り値
1) (なし)
2) 成功した場合はゼロ、実行時制約違反が検出された場合は非ゼロ。
[編集] ノート
その名前にもかかわらず、 C も POSIX 標準もこの関数がクイックソートを用いて実装されることも、計算量や安定性のいかなる保証も、要求していません。
他の境界チェック関数と異なり、 qsort_s
はサイズゼロの配列を実行時制約違反として扱わず、代わりに配列を変更することなく成功を返します (サイズゼロの配列を受理する他の関数は bsearch_s です)。
qsort_s
以前、 qsort
のユーザは比較関数に追加のコンテキストを渡すためにしばしばグローバル変数を使用していました。
[編集] 例
Run this code
#include <stdio.h> #include <stdlib.h> #include <limits.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 (fails if INT_MIN is present) } 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
[編集] 参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.22.5.2 The qsort function (p: 355-356)
- K.3.6.3.2 The qsort_s function (p: 609)