我希望拥有与C ++ std :: vector相同的东西,其中底层对象是不可变的。所以我可以将push_back()项添加到向量等等。实际的std :: vector维护一个数组,其下方大于向量的大小,填充了默认的构造对象,以及当你push_back时( ),它对数组中的元素进行赋值。我的不可变对象没有默认构造函数,赋值是一个变异操作,所以也是如此。
我可以做vector<boost::optional<T>>
,但这是一个混乱的界面,因为我只想将有效构造的对象放入向量中,并且只从向量中获取它们。
我认为提升有类似的东西,但我无法找到它。这样的事情存在吗?
答案 0 :(得分:4)
您对vector
如何运作的概念不正确。
向量使用分配器来分配原始内存。原始内存不包含默认的构造对象 - 它只是原始内存。
当您执行push_back
(例如)时,它会使用展示位置new
将对象构建到原始内存中。同样,当你erase
一个对象时,它最终会直接调用它的析构函数来将对象转回原始内存。
使用std::vector
的当前(C ++ 11或更高版本)实现,您的对象不需要支持默认构造或赋值。支持移动建设和移动分配应该足够了。要使用它们,您可能希望使用emplace_back
代替push_back
。