函数式编程语言通常用于不可变数据结构,但通过结构共享保持高效。例如。您处理某些信息地图,如果插入元素,则不会修改现有地图,但会创建新的更新版本。为避免大量复制和内存使用,映射将在两个实例之间共享(尽可能好)未更改的数据。
如果存在一些提供C ++数据结构等地图的模板库,我会感兴趣。我在LLVM的内部类旁边搜索了一下,什么都没发现。
答案 0 :(得分:3)
Copy On Write b +树听起来就像你要找的那样。它基本上每次修改时都会创建一个新的快照,但它会在版本之间共享未修改的叶节点。我见过的大多数实现都倾向于只附加数据库日志文件。 CouchDB对它们有很好的写作。然而,就地图数据结构而言,它们“相对容易”实现。
答案 1 :(得分:0)
您可以使用普通地图,但使用时间戳或“地图版本号”标记每个元素。如果您也想删除元素,请使用两个标记。如果您可能重新插入已删除的元素,则需要每个元素的值列表和标记对。
例如,您搜索键“foo”,并且发现它在版本0到3(包含)中具有值5,然后它被“删除”,然后它在版本中具有值-8 9到当前。
但这会占用大量的记忆和时间。