C++ 等价于不可变容器

Bee*_*ope 7 c++ collections immutability

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

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

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

我很想知道是否有一个标准化的(实际的或事实上的,如番石榴)相当于ImmutableCollection

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

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

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

我很清楚const std::iterator和朋友,但这是非常不同的 - 它确保调用者可以将对象传递给被调用者,并且对象不会修改它,但它不向被调用者保证对象获胜不会被修改。

现在我是 C++ 的长期用户,虽然在过去的 5 年中肯定不是,而且我无法想出明显的等价物。

Whi*_*TiM 0

不,C++ 中没有这样的容器,但是在两个层面上做到这一点确实很容易...首先const正确使用要存储的对象的类,其次是使用 const 引用或指向您想要的容器的指针。例子:

#include <iostream>
#include <vector>
#include <string>
#include <memory>

using namespace std;

class Cow {
  public:
  Cow() : name("default") {}
  Cow(string Name) : name(Name) {}

  string shout() const { return name; }

  private:
  string name;
};

int main() {
    vector<unique_ptr<const Cow>> mc;
    Cow mm("Lol");
    mc.push_back(make_unique<const Cow>(Cow()));
    mc.push_back(make_unique<const Cow>(Cow("haha")));
    mc.push_back(make_unique<const Cow>(mm));

    const auto& mcc = mc;  //here, your immutable reference

    for(auto& x : mcc)
        cout << x.get()->shout() << " - - ";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在这里使用 a 是std::unique_ptr因为,它几乎肯定没用vector<const Cow> mc

这部分,const auto& mcc = mc;从这里开始,mcc 作为你的不可变容器......你不能通过任何合法手段添加或修改它的元素,除非原因抛弃const......

这适用于我所知道的所有其他容器。

仍在 Stackoverflow 上,请参阅不可变 C++ 容器类具有可变内容的不可变容器

旁注:此外,如果您要使用的类不const正确,请创建一个正确的廉价包装类,const然后使用该包装器。