我想知道如何在C ++(或C)中实现不可变数据结构。我正在寻找关于这个主题的书或论文(或者相对简单且有文档记录的实现),我现在还没找到,所以我决定要求提示。 提前感谢您的回答。
答案 0 :(得分:3)
我想你可以从另一种语言中获取一个想法。例如在Java和C#immutability中实现以下方式。我们不是创建“mutators”(“改变”对象状态的函数),而是创建返回新“已更改”实例的函数:
class Foo
{
public:
Foo(int i)
: i_(i)
{}
int GetI() const {return i_;}
Foo SetI(int i) const {return Foo(i);}
private:
const int i_;
};
答案 1 :(得分:2)
您可以将对象声明为const,如:
const std::string x("My Const String");
这是使用const关键字使对象不可变的常用方法。
如果你知道你有一个对象,你不想允许任何改变,这应该是 在该对象的每个实例的行为的一部分,您可以使用所有const成员创建一个对象。
class Immutable
{
public:
Immutable() :z(10), y(20)
{
}
Immutable(int zVal, int yVal) : z(zVal), y(yVal)
{
}
int getZ() const;
int getY() const;
private:
const int z;
const int y;
};
请注意,您必须在初始化列表中设置const成员的值。 (无论如何你应该使用它作为最佳实践)
答案 2 :(得分:0)
const
是您的朋友 - 所有数据成员const
的对象很难改变。
答案 3 :(得分:0)
Phoenix将FP的概念进一步扩展到C ++。简而言之,框架打开了FP技术,如Lambda(未命名函数)和Currying(部分函数求值)。
所以它超越了简单的不可变结构,但我认为这是你前进的方向。
答案 4 :(得分:0)
提示:声明struct
如下:
struct Immutable
{
private:
Immutable& operator =(const Immutable& other);
};
这会锁定赋值运算符。现在确保结构没有public
或mutable
成员变量,并且所有公共方法都是const
:
public:
int get_quux() const;
void foo(int bar) const;
你有一些非常接近不可变类型的东西。当然,C ++中缺少sealed
/ final
意味着无论如何有人可以从你的派生出一个不太可变的类型。
答案 5 :(得分:0)
取决于“不可变数据结构”的含义。
如果您的意思是,无法将此类型的变量分配给其他方式进行修改的类型,请在此处查看其他答案(删除对赋值运算符的访问权限,使用const
,或仅使用引用或{ {1}}数据成员)。
如果您的意思是,无法修改该类型的值的类型,例如。像Java或C#或Python字符串,但仍然可以分配该类型的变量,那么它更棘手。您最好的帮助可能是const
来管理内部可变状态。 boost::intrusive_ptr
与{1}相对的原因intrusive_ptr
shared_ptr
允许更多优化,其中一个优化对于“不可变的字符串”,即从字面构造这样一个没有动态分配的野兽。
我不知道在C ++中使用后一种“不可变数据结构”的任何通用框架。
所以,看来你提出了一个好主意! : - )
答案 6 :(得分:0)
我在Github上发现了一个名为gorgone的项目,其中包含PersistentVector的C ++实现(基于Rich Hickey在Clojure中的Java实现)和RRBVector(基于Phil Bagwell最近的工作)。
该项目的维护者不再追求它,但我是。请看我的叉子:https://github.com/sandover/gorgone
答案 7 :(得分:0)
我无法推荐这篇文章Immutable C++ stack - thoughts and performance,代码审核和答案非常棒!
另外,要开始使用C ++中的persistent data structures
或functional data structures
,请阅读此帖Functional Data Structures in C++: Lists。