Bee*_*ope 7 c++ collections immutability
最近的一次讨论让我想到了一个问题:
C++ 中是否存在不可变容器?或者,由于 C++ 更喜欢迭代器而不是通用容器,因此是否存在不可变迭代器?
我说的是类似于 GuavaImmutableList或内置Collections.unmodifiable*方法的东西。需要明确的是,这两种类型的集合是非常不同的 - 前者本质上是不可变的,而后者只能由获得不可修改引用的参与者不可变,但可以由有权访问解包对象的参与者修改。
我很想知道是否有一个标准化的(实际的或事实上的,如番石榴)相当于ImmutableCollection:
或ret ro = Colletions.unmodifiableCollection(orginalCollection)(和相关方法):
originalCollection但任何人都不能修改它的返回值ro。通常它是通过将原始集合包装在防止任何修改的代理中来实现的,但其他实现也是可能的。我很清楚const std::iterator和朋友,但这是非常不同的 - 它确保调用者可以将对象传递给被调用者,并且对象不会修改它,但它不向被调用者保证对象获胜不会被修改。
现在我是 C++ 的长期用户,虽然在过去的 5 年中肯定不是,而且我无法想出明显的等价物。
不,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然后使用该包装器。