0

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 删除 tbl 中 x 的当前绑定,如果存在则恢复之前的绑定。如果 x 未绑定在 tbl 中,则它什么也不做。

4

2 回答 2

6

有两种合法的使用模式Hashtbl:总是使用Hashtbl.replace,这确保每个键在表中只有一个绑定,或者使用表作为多重映射(每个键指向值列表)Hasthbl.addHashtbl.findHashtbl.find_all

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

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

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在假设绑定应该存在时使用它来检查绑定是否存在。

于 2013-01-30T12:28:16.250 回答
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 *)
于 2013-01-30T11:38:50.357 回答