2010-05-03 58 views
21

有谁知道C++数据结构库提供熟悉的STL结构的功能性(a.k.a.不可变,或FP意义上的“持久性”)等价物吗? “功能”我的意思是对象本身是不可变的,而对这些对象的修改返回与适当的父对象共享内部相同内部的新对象。理想情况下,这样的库类似于STL,并且可以和Boost.Phoenix一起工作(警告 - 我没有真正使用Phoenix,但据我所知它提供了很多算法,但没有数据结构,除非懒惰计算的变化到现有的数据结构计数 - 是吗?)C++中的函数式数据结构

+0

您是否可以通过按值传递和返回所有对象来大致获得所需的效果? – 2010-05-03 10:09:28

+4

只有我能承受性能和内存开销。功能数据结构的诀窍是它们尽可能共享内部。这是安全的,因为对象是不可变的,并且比仅仅在大数据结构上返回值要少得多的内存和处理器。 – drg 2010-05-03 10:14:54

+6

我在http://portal.acm.org/citation.cfm?id=1596591共同撰写经验报告时,对同一个问题产生了真正的兴趣。我当时的结论是,你真的需要垃圾收集:持久结构的优势在于共享,但是在共享的存在下,不再有任何单一节点的明确所有权,因此某种中央当局(GC)必须决定哪些节点可以回收。对于您的应用程序来说,节点只被分配并且永远不会被释放并不重要。 – 2010-05-03 10:28:38

回答

3

我会看看,看看是否由Yannis Smaragdakis开发的FC++包括任何数据结构。当然,这个项目比任何其他项目都支持C++中的功能风格。

+0

看起来像一个有趣的图书馆,尽管没有最近的活动。在那里有一个持久的列表数据类型,但它看起来不适合FC++之外的通用应用。 – drg 2010-05-03 22:26:31

1

这不仅仅是一个详细的答案,而且Bartosz Milewski似乎在这方面做了很多工作。参见,例如:

http://bartoszmilewski.com/2013/11/13/functional-data-structures-in-c-lists/

看起来像他在这里实现了很多的算法从Okasiki的书纯功能性数据结构:

https://github.com/BartoszMilewski/Okasaki

注:我还没有尝试过,但它们是我在FC++之外看到的第一个C++持久数据结构。

希望我会尽快尝试。

+0

他们似乎缺少重要的部分......就像删除 – Michael 2014-10-23 03:10:43