【发布时间】:2023-04-02 04:25:01
【问题描述】:
我试图为我对多线程/并发场景感兴趣的几个数据结构编写一些实现。
很多函数式语言,几乎我所知道的所有,都以不可变的方式设计自己的数据结构,所以这意味着如果你要将value添加到实例t1 T,你真的得到了一个新的 T 实例,它包含 t1 + value。
container t;
container s = t; //t and s refer to the same container.
t.add(value); //this makes a copy of t, and t is the copy
我在 C++11 中找不到合适的关键字来执行此操作;标准库中的关键字、语义和函数显然是面向函数式方法的,特别是我发现:
-
mutable它不是用于运行时,它更有可能是对编译器的提示,但是这个关键字并不能真正帮助您设计新的数据结构或以 不可变 方式使用数据结构 -
swap不适用于临时工,这对我来说是一个很大的缺点
我也不知道其他关键字/函数对这样的设计有多大帮助,swap 是其中一个非常接近好的东西,所以我至少可以开始写一些东西,但显然它仅限于lvalues .
所以我要问:是否可以在 C++11 中使用函数式方法设计 不可变 数据结构?
【问题讨论】:
-
当然这是可能的。是什么让您认为它不是,更具体地说,它对您来说似乎很难/不可能?
-
您能做的最好的事情就是始终使用
const限定符声明数据结构的instances。问题是,与真正的函数式语言(例如 Haskel)相比,您不会获得那么多。这样的语言高度利用所有值都是常量的事实,并且每个表达式只依赖于它自己(而不依赖于其他状态)。无论数据结构的设计如何,C++ 都不是这种情况。您可能想要告诉编译器只允许您的类的 const 实例,这是不可能的。 -
设计一个不可变的数据结构很容易......只需创建一个包含数据成员的容器,例如现有的标准库数据结构之一,然后让变异函数进行深度复制,变异副本,然后按值返回。您可以从任何类型的代码中使用此类对象。不是特别可扩展,但完全是挑你的毒药。
-
@user2485710:
const std::vector<T>是我们标准的不可变数据结构。
标签: c++ multithreading c++11 data-structures immutability