attractivechaos / klib

A standalone and lightweight C library
http://attractivechaos.github.io/klib/
MIT License
4.18k stars 556 forks source link

One question about the khash's example. #148

Open lxyscls opened 4 years ago

lxyscls commented 4 years ago
#include "khash.h"
KHASH_MAP_INIT_INT(m32, char)        // instantiate structs and methods
int main() {
    int ret, is_missing;
    khint_t k;
    khash_t(m32) *h = kh_init(m32);  // allocate a hash table
    k = kh_put(m32, h, 5, &ret);     // insert a key to the hash table
#8    if (!ret) kh_del(m32, h, k);
#9    kh_value(h, k) = 10;             // set the value
    k = kh_get(m32, h, 10);          // query the hash table
    is_missing = (k == kh_end(h));   // test if the key is present
    k = kh_get(m32, h, 5);
    kh_del(m32, h, k);               // remove a key-value pair
    for (k = kh_begin(h); k != kh_end(h); ++k)  // traverse
        if (kh_exist(h, k))          // test if a bucket contains data
            kh_value(h, k) = 1;
    kh_destroy(m32, h);              // deallocate the hash table
    return 0;
}

Line 8, kh_del(m32, h, k) will unset the flag, if there is a duplication with key 5. Line 9, give a new value.

I think those statements can't go through a kh_exist test after line 9. It does not make sense!

Because this is an intchar map, so there is nothing need to do. But for some other int(void *) map, we need to do some resource free when (!ret) but not kh_del.