other versions
other languages
| HSEARCH(3) | Linux Programmer's Manual | HSEARCH(3) |
名前¶
hcreate, hdestroy, hsearch, hcreate_r, hdestroy_r, hsearch_r - ハッシュテーブルの管理書式¶
#include <search.h>int hcreate(size_t nel);ENTRY *hsearch(ENTRY item, ACTION action);void hdestroy(void);#define _GNU_SOURCE /* feature_test_macros(7) 参照 */#include <search.h>int hcreate_r(size_t nel, struct hsearch_data *htab);int hsearch_r(ENTRY item, ACTION action, ENTRY **retval, struct hsearch_data *htab);void hdestroy_r(struct hsearch_data *htab);
説明¶
hcreate(), hsearch(), hdestroy() の 3 つの関数を利用すると、キー (文字列) と対応するデータから構成される エントリを格納できるハッシュ検索テーブルを作成、管理することができる。 これらの関数を使って、一度に使用できるのは一つのハッシュテーブルだけである。typedef struct entry {
char *key;
void *data;
} ENTRY;
返り値¶
hcreate() と hcreate_r() は、成功した場合 0 以外の値を返し、 エラーの場合 0 を返す。エラー¶
hcreate_r() と hdestroy_r() は以下の理由で失敗する可能性がある。- EINVAL
- htab が NULL である。
- ENOMEM
- action が ENTER で、 key がテーブル内に見つからず、 テーブルに新しいエントリを追加する余地がなかった。
- ESRCH
- action が FIND で、 key がテーブル内に見つからなかった。
準拠¶
関数 hcreate(), hsearch(), hdestroy() は SVr4 から導入されたもので、POSIX.1-2001 に記述されている。 関数 hcreate_r, hsearch_r, hdestroy_r は GNU の拡張である。注意¶
通常、ハッシュテーブルの実装は、衝突を最小限にするために テーブルに十分な空き領域がある場合に効率がよくなる。 このため、普通は、 nel を、呼び出し側がテーブルに格納しようと思っている エントリの最大数より少なくとも 25% は大きな値にすべきである。バグ¶
SVr4 と POSIX.1-2001 の規定では、 action は検索が失敗したときにだけ意味を持つとなっている。 よって、検索が成功した場合、 action の値が ENTER でも 何もすべきではない。 (バージョン 2.3 より前の) libc と glibc の実装はこの規格に違反しており、 この状況で、指定された key に対応する data が更新される。例¶
次のプログラムは、ハッシュテーブルに 24 個の項目を挿入し、 それからそのうちのいくつかを表示する。
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
char *data[] = { "alpha", "bravo", "charlie", "delta",
"echo", "foxtrot", "golf", "hotel", "india", "juliet",
"kilo", "lima", "mike", "november", "oscar", "papa",
"quebec", "romeo", "sierra", "tango", "uniform",
"victor", "whisky", "x-ray", "yankee", "zulu"
};
int main()
{
ENTRY e, *ep;
int i;
hcreate(30);
for (i = 0; i < 24; i++) {
e.key = data[i];
/* データは、ポインタではなく、単なる整数値である。 */
e.data = (void *) i;
ep = hsearch(e, ENTER);
/* エラーは起こらないはずである。 */
if (ep == NULL) {
fprintf(stderr, "entry failed\n");
exit(EXIT_FAILURE);
}
}
for (i = 22; i < 26; i++) {
/* テーブルにある 2 つのエントリを表示し、
あとの 2 つがテーブルにないことを示す。 */
e.key = data[i];
ep = hsearch(e, FIND);
printf("%9.9s -> %9.9s:%d\n", e.key,
ep ? ep->key : "NULL", ep ? (int)(ep->data) : 0);
}
hdestroy();
exit(EXIT_SUCCESS);
}
関連項目¶
bsearch(3), lsearch(3), malloc(3), tsearch(3)この文書について¶
この man ページは Linux man-pages プロジェクトのリリース 3.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。| 2011-09-10 | GNU |