寻找如何在C+中实现不可变数据结构的提示+; 我想知道如何在C++(或C)中实现不可变的数据结构。我正在寻找一本关于这个主题的书或论文(或一个相对简单且有文档记录的实现),但目前还没有找到,所以我决定寻求一些提示。 提前感谢您的回答。const是您的朋友-包含所有数据成员的对象const很难更改。
请查看 <>菲尼克斯将FP的概念进一步扩展到C++。简而言之,该框架提供了FP技术,如Lambda(未命名函数)和Currying(部分函数求值)寻找如何在C+中实现不可变数据结构的提示+; 我想知道如何在C++(或C)中实现不可变的数据结构。我正在寻找一本关于这个主题的书或论文(或一个相对简单且有文档记录的实现),但目前还没有找到,所以我决定寻求一些提示。 提前感谢您的回答。const是您的朋友-包含所有数据成员的对象const很难更改。,c++,data-structures,immutability,C++,Data Structures,Immutability,请查看 菲尼克斯将FP的概念进一步扩展到C++。简而言之,该框架提供了FP技术,如Lambda(未命名函数)和Currying(部分函数求值) 因此,它超越了简单的不可变结构,但我假设这就是您的方向。提示:声明一个struct,如下所示: struct Immutable { private: Immutable& operator =(const Immutable& other); }; 这将锁定赋值运算符。现在,确保结构没有公共或可变成员变量,并且其所有公共方法都
因此,它超越了简单的不可变结构,但我假设这就是您的方向。提示:声明一个
struct
,如下所示:
struct Immutable
{
private:
Immutable& operator =(const Immutable& other);
};
这将锁定赋值运算符。现在,确保结构没有公共
或可变
成员变量,并且其所有公共方法都是常量
:
public:
int get_quux() const;
void foo(int bar) const;
你有一些非常接近不可变类型的东西。当然,C++中的<>代码/> >>代码>最终< /代码>意味着有人可以从你的派生出一个不可变的类型。 < P>我想你可以从另一种语言中得到一个想法。例如,在Java和C中,不变性按以下方式实现。我们不创建“mutators”(对对象状态进行“mutator”的函数),而是创建返回新的“changed”实例的函数:
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_;
};
您可以将对象声明为常量,如: 常量std::string x(“我的常量字符串”)代码> 这是使用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
,或仅具有引用或const
数据成员,删除对赋值运算符的访问)
如果你的意思是,一种不能修改该类型的值的类型,例如Java、C#或Python字符串,但是仍然可以分配该类型的变量,那么它就更复杂了。您最好的帮助可能是boost::intrusive_ptr
来管理内部可变状态。侵入式\u ptr
与共享式\u ptr相反的原因是侵入式\u ptr
允许进行更多优化,其中一个优化对于例如“不可变字符串”至关重要,即从根本没有动态分配的文本构建这样的beast
< >我不知道在C++中做后一种“不可变数据结构”的一般框架。
看来你提出了一个好主意!:-) > P>我在Github上找到了一个叫做GOGONE的项目,它包含了C++的持久化向量实现(基于Culjure中的ReaveHigKy的java实现)和RRBV向量(基于Phil Bagwell最近的工作)。p>
那个项目的维护者不再追求它,但我是。请看我的文章:我忍不住推荐这篇文章,代码回顾和答案真是太棒了
也可以,在C++中使用“<代码>持久数据结构< /COD>或<代码>函数数据结构< /代码>,阅读此帖子。< /P>不可变不意味着不可复制。你不必担心对象被复制。你完全正确,只需担心对象被分配到。答复也相应更新。感谢您的指导。这正是我所说的“不可变”的意思,但我正在寻找关于如何有效实现不可变集合(例如:Clojure集合)的提示,特别是如何共享部分结构以避免不必要的复制。@fokenrute我想这才是真正的问题,共享不可变结构的部分。在垃圾收集语言中,这非常简单。也许您正在寻找持久数据结构()?如果是这样的话,您还可以查看.net中的不可变集合以获得其他一些提示()我不知道您是否仍在寻找答案,但最好看看Rich Hickey是如何使用java在clojure中实现不可变数据结构的。它还允许结构共享吗?