C++ 等价于不可变容器

标签 c++ collections immutability

最近的讨论让我想到了这个问题:

C++ 中是否存在不可变容器?或者,由于 C++ 更喜欢迭代器而不是通用容器,因此是否存在不可变迭代器?

我说的是类似于 Guava 的 ImmutableList 的东西或内置的 Collections.unmodifiable* 方法。需要明确的是,这两种类型的集合非常不同 - 前者本质上是不可变的,而后者仅对于获得不可修改引用的参与者不可变,但可以由有权访问未包装对象的参与者进行修改。

我很想知道是否有一个标准化的(实际的或事实上的,如在 Guava 中)等同于 ImmutableCollection:

  • 任何 Actor 都无法修改的集合。此外,采用这种类型的函数提供的文档表明它们不能也不会修改作为参数接收或作为返回值返回的此类集合。

ret ro = Colletions.unmodifiableCollection(orginalCollection)(及相关方法):

  • 与上述略有不同,这是原始集合的 View ,任何拥有 originalCollection 的人都可以修改它,但不能由任何拥有返回值 ro。通常它是通过将原始集合包装在防止任何修改的代理中来实现的,但其他实现也是可能的。

我很了解 const std::iterator 和 friend ,但这非常不同 - 它确保调用者可以将对象传递给被调用者,而对象不会修改它,但它不向被调用者保证该对象不会被修改。

现在我是这里的 C++ 长期用户,虽然承认在过去 5 年里不是这样,但我想不出明显的等价物。

最佳答案

有一个名为 immer 的项目可能能够满足这种需求:

“C++ 的不可变和持久数据结构”

https://github.com/arximboldi/immer

关于C++ 等价于不可变容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518879/

相关文章:

c++ - opencv BGR2GRAY 和 Pillow 转换函数之间的区别

c++ - 如果在保持相同类型的同时添加常量,static_cast 运行时开销是多少?

c++ - 无法更改光标(从 OnSetCursor 内部)

java - 根据两个映射的键将两个映射迭代到第三个映射

variables - 是否可以在 Rust 中使用 match 初始化不可变变量?

java - 我可以在不可变类中使用 StringBuilder

c++ - 是否有任何标准方法可以在 Linux 上使用 C++ 从文件加载参数?

java - NetBeans "Return of Collection Field"可选警告是什么?

java - 累积字符串集合散列

java - 在任何给定时刻使变量成为最终变量(在初始化和最终代码之后)