我正在尝试为我感兴趣的一些数据结构编写实现,以用于多线程/并发场景。
很多函数式语言,几乎所有我所知道的语言,都会以不可变的方式设计它们自己的数据结构。这意味着,如果你想将一个
我无法找到适合在C++11中实现此操作的关键字。虽然标准库中有一些关键字、语义和函数明显面向函数式方法,但这些关键字并不能真正帮助你设计新的数据结构或以不可变方式使用数据结构,例如:
因此我想问:在C++11中使用函数式方法是否可能设计出不可变的数据结构?
很多函数式语言,几乎所有我所知道的语言,都会以不可变的方式设计它们自己的数据结构。这意味着,如果你想将一个
value
添加到 T
的实例 t1
中,你实际上会得到一个新的 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
是其中一个离好东西最近的关键字,所以我至少可以开始写一些代码,但显然它只限于lvalue
。因此我想问:在C++11中使用函数式方法是否可能设计出不可变的数据结构?
const
限定符声明你的数据结构的实例。问题在于,与真正的函数式语言(如Haskel)相比,你不会获得太多好处。这些语言高度利用所有值都是常量的事实,并且每个表达式仅依赖于自身(而不依赖于其他状态)。无论你的数据结构的设计如何,C++都不是这种情况。你可能想要告诉编译器只允许使用类的const实例,但这是不可能的。 - leemesconst
函数,就可以同时让多个读者访问标准容器...这实际上意味着容器在任何会改变它们的地方都必须是线程安全的,但在实践中,它们不需要具有需要显式线程安全性的mutable
数据字段。 - Tony Delroy