C ++中不可变对象的可变容器

时间:2014-12-03 19:04:08

标签: c++

我希望拥有与C ++ std :: vector相同的东西,其中底层对象是不可变的。所以我可以将push_back()项添加到向量等等。实际的std :: vector维护一个数组,其下方大于向量的大小,填充了默认的构造对象,以及当你push_back时( ),它对数组中的元素进行赋值。我的不可变对象没有默认构造函数,赋值是一个变异操作,所以也是如此。

我可以做vector<boost::optional<T>>,但这是一个混乱的界面,因为我只想将有效构造的对象放入向量中,并且只从向量中获取它们。

我认为提升有类似的东西,但我无法找到它。这样的事情存在吗?

1 个答案:

答案 0 :(得分:4)

您对vector如何运作的概念不正确。

向量使用分配器来分配原始内存。原始内存包含默认的构造对象 - 它只是原始内存。

当您执行push_back(例如)时,它会使用展示位置new将对象构建到原始内存中。同样,当你erase一个对象时,它最终会直接调用它的析构函数来将对象转回原始内存。

使用std::vector的当前(C ++ 11或更高版本)实现,您的对象不需要支持默认构造或赋值。支持移动建设和移动分配应该足够了。要使用它们,您可能希望使用emplace_back代替push_back