2015-02-11 79 views
0

我使用search.h库通过hcreate函数定义哈希表。获取(search.h)哈希搜索表中的所有密钥

我该如何检查该表中的所有键? hsearch总是期望一个条目来搜索(或存储)。

This是文档到管理哈希表(hcreatehsearchhdestroy),但有没有提到如何通过结构进行迭代以获取所有已存储密钥的所有三个功能。

当在表格中存储条目时,I malloc是关键值,所以想要一个简单的方法来释放这些值。

我可以避免必须将它们存储在单独的结构(如数组)中吗?

我不希望hdestroy自动为我做这件事,因为它无法知道key指向动态分配或静态内存(或实际上,如果我还没有释放内存)。

切换到不同的哈希搜索表库不是一个选项。我必须与此合作。我在CentOS上使用GCC 4.1.2。

回答

2

没有通过哈希表条目迭代的标准功能。这个问题是解决here(在hdestroy部分):

记得包含在当时hdestroy散列 表中的元素被称为不受此功能中解脱出来是很重要的。 程序代码的责任是释放这些字符串(如果 需要)。释放所有元素内存是不可能的 没有额外的,单独保留的信息,因为没有函数 遍历散列表中的所有可用元素。如果 确实需要释放一个表和所有元素,程序员 必须保留所有表元素的列表,并在调用hdestroy 之前必须使用此列表释放所有元素的数据。这是一个非常不愉快的机制,它也表明这种哈希表主要用于一次创建的表,并且直到程序运行结束时才使用 。

+0

良好的联系,我认为这只是一些古怪的第三方图书馆。请注意安全警告:'MT-不安全种族:hsearch | AS-不安全的堆| AC-Unsafe腐败mem',这只是确认我的本能,不惜一切代价避免它。 – kdopen 2015-02-11 15:38:50

+0

谢谢,看起来好像没有四处存储所有malloc'd元素在一个单独的结构。 – Nobilis 2015-02-11 15:39:34

1

没有看过库的实际来源,我会说在创建哈希表后没有办法走过哈希表。您将被要求在单独的结构中记住malloc'd内存的指针。

坦率地说,我不认为我会用十英尺的杆子碰那个图书馆。该API有许多问题

  • 残暴文档
  • 库只能支持单一的哈希表(注意:hcreate不返回的句柄,然后传递给hsearchhdestroy
  • 无力行走该表或检索密钥严重限制了它的使用。

相反,根据您的平台(你不说,不管你是在Windows或基于Unix的OS),我会好好长时间看glib它支持丰富的数据结构的(documentation home

对哈希表的文档是here。这是针对图书馆的2.42版本 - 它们没有“最新版本”的通用链接。

glib是GNOME(Ubuntu UI)的核心,但不需要使用任何gmainloop或事件泵相关功能。