ハッシュテーブルを使ってみる
APR(Apache Portable Runtime)のハッシュ機能を使ってみました。ハッシュ機能を利用する場合の手順は次のようになるようです。
- apr_pool_create関数を使用して、ハッシュ機能で使用するメモリプールを作成します。
- apr_hash_make関数を使用して、ハッシュテーブルを作成します。
- apr_hash_set関数を使用して、ハッシュテーブルに要素を追加します。
- apr_hash_set,apr_hash_get,apr_hash_first,apr_hash_next,apr_hash_this,apr_hash_count関数などを使用して、各要素にアクセスします。
- ハッシュテーブルを使い終わったら、apr_pool_clearまたはapr_pool_destroy関数を使用して、メモリプールを破棄します。
プログラム例
ハッシュテーブルへ、文字列のキーと値のペアを3つ登録し、各要素の取得、変更、削除をするサンプルプログラムを作成してみました。
try_apr_hash.c
#include <stdio.h> #include "apr_hash.h" void print_hash(apr_pool_t *pool, apr_hash_t *hash) { apr_hash_index_t *hash_index = NULL; const void *key = NULL; void *val = NULL; // 要素数を出力する。 printf("要素数:[%d]\n", apr_hash_count(hash)); // 内容を出力する。 hash_index = apr_hash_first(pool, hash); while (hash_index) { apr_hash_this(hash_index, &key, NULL, &val); printf("key=[%s], value=[%s]\n", (char*)key, (char*)val); hash_index = apr_hash_next(hash_index); } } int main(int argc, char **argv) { apr_status_t status = APR_SUCCESS; apr_pool_t *pool = NULL; apr_hash_t *hash = NULL; char *key1 = "key1"; char *key2 = "key2"; char *key3 = "key3"; char *value1 = "value1"; char *value2 = "value2"; char *value3 = "value3"; char *value4 = "value4"; // APRを初期化する。 apr_initialize(); // メモリプールを作成する。 status = apr_pool_create(&pool, NULL); if (status == APR_SUCCESS) { // ハッシュを作成する。 hash = apr_hash_make(pool); // 要素を追加する。 apr_hash_set(hash, key1, APR_HASH_KEY_STRING, value1); apr_hash_set(hash, key2, APR_HASH_KEY_STRING, value2); apr_hash_set(hash, key3, APR_HASH_KEY_STRING, value3); printf("キー[%s]の値=[%s]\n", key1, (char*)apr_hash_get(hash, key1, APR_HASH_KEY_STRING)); // ハッシュの内容を出力する。 print_hash(pool, hash); // 要素を変更する。 apr_hash_set(hash, key2, APR_HASH_KEY_STRING, value4); // ハッシュの内容を出力する。 print_hash(pool, hash); // 要素を削除する。 apr_hash_set(hash, key2, APR_HASH_KEY_STRING, NULL); // ハッシュの内容を出力する。 print_hash(pool, hash); } else { printf("メモリプールを作成できませんでした。\n"); } // APRを終了する。 apr_terminate(); return 0; }
実行結果
$ ./try_apr_hash.exe
キー[key1]の値=[value1]
要素数:[3]
key=[key1], value=[value1]
key=[key2], value=[value2]
key=[key3], value=[value3]
要素数:[3]
key=[key1], value=[value1]
key=[key2], value=[value4]
key=[key3], value=[value3]
要素数:[2]
key=[key1], value=[value1]
key=[key3], value=[value3]
補足
apr_hash_set関数について
引数にキーと値のポインタを渡します。ハッシュテーブルの各要素は、ポインタで参照される領域をそのまま使用するようです。そのため、呼び出し側で用意したキーと値の領域は、ハッシュテーブルを使い終わるまで、保持しておく必要があるようです。
参考サイト
Apache Portable Runtime: Hash Tables
http://apr.apache.org/docs/apr/1.2/group__apr__hash.html
動作環境
OS : Windows XP, Cygwin
APR Version : 1.2.12