寻找如何在C+中实现不可变数据结构的提示+; 我想知道如何在C++(或C)中实现不可变的数据结构。我正在寻找一本关于这个主题的书或论文(或一个相对简单且有文档记录的实现),但目前还没有找到,所以我决定寻求一些提示。 提前感谢您的回答。const是您的朋友-包含所有数据成员的对象const很难更改。

寻找如何在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); }; 这将锁定赋值运算符。现在,确保结构没有公共或可变成员变量,并且其所有公共方法都

请查看

<>菲尼克斯将FP的概念进一步扩展到C++。简而言之,该框架提供了FP技术,如Lambda(未命名函数)和Currying(部分函数求值)


因此,它超越了简单的不可变结构,但我假设这就是您的方向。

提示:声明一个
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中实现不可变数据结构的。它还允许结构共享吗?