繁体   English   中英

搜索有关如何在C ++中实现不可变数据结构的提示

[英]Searching for hints on how to implement immutable data structures in C++

我想知道如何在C ++(或C)中实现不可变数据结构。 我正在寻找关于这个主题的书或论文(或者相对简单且有文档记录的实现),我现在还没找到,所以我决定要求提示。 提前感谢您的回答。

我想你可以从另一种语言中获取一个想法。 例如在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_;
};

您可以将对象声明为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成员的值。 (无论如何你应该使用它作为最佳实践)

我在Github上发现了一个名为gorgone的项目,其中包含PersistentVector的C ++实现(基于Rich Hickey在Clojure中的Java实现)和RRBVector(基于Phil Bagwell最近的工作)。

该项目的维护者不再追求它,但我是。 请看我的叉子: https//github.com/sandover/gorgone

我不禁推荐这篇文章不可变的C ++堆栈 - 思想和性能 ,代码审查和答案真的很棒!

另外,要开始使用C ++中的persistent data structuresfunctional data structures ,请阅读以下文章:C ++中的功能数据结构:列表

const是你的朋友 - 所有数据成员const对象很难改变。

看看凤凰框架。

Phoenix将FP的概念进一步扩展到C ++。 简而言之,框架打开了FP技术,如Lambda(未命名函数)和Currying(部分函数求值)。

所以它超越了简单的不可变结构,但我认为这是你前进的方向。

提示:声明一个struct如下:

struct Immutable
{
private:
    Immutable& operator =(const Immutable& other);
};

这会锁定赋值运算符。 现在确保struct没有publicmutable成员变量,并且所有公共方法都是const

public:
    int get_quux() const;
    void foo(int bar) const;

你有一些非常接近不可变类型的东西。 当然,C ++中缺少sealed / final意味着无论如何有人可以从你的类中获得一个不太可变的类型。

取决于“不可变数据结构”的含义。

如果你的意思是,一种类型,其中该类型的变量不能被分配给否则被修改,那么请在此处查看其他答案(删除对赋值运算符的访问,使用const ,或者只是具有引用或const数据成员)。

如果你的意思是,一种类型,其中不能修改该类型的 ,例如像Java或C#或Python字符串,但仍然可以分配该类型的变量,那么它更棘手。 你最好的帮助可能是boost::intrusive_ptr来管理一个内部可变状态。 intrusive_ptr与例如shared_ptr相反的原因是intrusive_ptr允许更多优化,其中一个对于例如“不可变字符串”是至关重要的,即,根据文字构建这样的野兽而根本没有动态分配。

我不知道在C ++中使用后一种“不可变数据结构”的任何通用框架。

所以,似乎你提出了一个好主意! :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM