2015-02-11 76 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或事件泵相關功能。