ocaml hashtbl删除功能

时间:2013-01-30 11:01:36

标签: ocaml

Hashtbl如何删除恢复先前的绑定。

Hashtbl.add t key1  
Hashtbl.remove t key1  
Hashtbl.remove t key1  => This should do anything but not restore the key1 !

无论如何,为什么我可以删除确定的东西,如果它被删除,那么应该遵循适当的流程?

val remove : ('a, 'b) t -> 'a -> unit Hashtbl.remove tbl x removes the current binding of x in tbl, restoring the previous binding if it exists. It does nothing if x is not bound in tbl.

2 个答案:

答案 0 :(得分:6)

Hashtbl有两种合法的使用方式:始终使用Hashtbl.replace,这可确保每个密钥在表中只有一个绑定,或者将表用作多映射(每个密钥)使用Hasthbl.addHashtbl.findHashtbl.find_all指向值列表。

请确保您了解您感兴趣的使用模式。如果您不想保留旧的绑定,则无需为同一个键添加多个绑定(这可能会导致性能问题,内存泄漏和堆栈溢出);在这种情况下,您应该使用Hashtbl.replace代替Hashtbl.add,而Hashtbl.remove将完全按照您的预期执行。

如果您将哈希表用作多映射,并且想要一个删除键的所有绑定的函数,则可以将其实现为yourslef(代码未经测试):

let rec remove_all tbl key =
  if Hashtbl.mem tbl key then begin
    Hashtbl.remove tbl key;
    remove_all tbl key
  end

编辑:我只是理解另一种阅读(难以理解)问题的方法是“如何确保在表格中删除密钥,而不是在remove时默默无效叫什么名字?”。 cago为此提供了一个代码片段,实际上,当您认为绑定存在时,您可以使用Hashtbl.mem检查绑定是否存在。

答案 1 :(得分:2)

如果您使用Hashtbl.replace代替Hashtbl.add,则会替换t中当前密钥的绑定。所以函数Hashtbl.remove不会恢复任何东西。

您也可以编写自己的删除功能:

let remove tbl key =
   if Hashtbl.mem tbl key then Hashtbl.remove tbl key
   else raise Nothing_to_remove_in_the_hashtbl

Hashtbl.replace t key1 value;;
remove t key1;;
remove t key1;;  (* raise Nothing_to_remove_in_the_hashtbl *)