将根层次结构的对象存储在向量中

时间:2014-05-31 10:43:31

标签: c++ pointers reference invalidation

我有一个singly-rooted object hierarchy,每个对象都有一个指向其父类型的指针。根对象是一个只移动的类(它有一个移动ctor和移动赋值运算符,但没有默认的ctor也没有赋值)。问题是当向量增长时我得到了无效的指针。使用列表对我来说不是一个好的解决方案。

我正在寻找改变当前设计的任何解决方案。

1 个答案:

答案 0 :(得分:2)

如果您事先知道要存储的对象数,可以使用std::vector::reserve成员函数来确保不会重新分配内存。这也可以提高性能,因为它提供了更好的参考局部性。

如果您事先不知道对象的数量,而不是将对象直接存储在向量中并且之后使用指向对象的指针,则更好的解决方案是将实际指针存储在向量中。这是使用std::unique_ptr的一个很好的例子,因为你的向量拥有对象:

std::vector<std::unique_ptr<Object>> container;
std::unique_ptr<Object> object(new Object(/* */));
container.push_back(std::move(object));

作为最后的手段,您可以使用索引代替指针,在流程中实现良好的引用局部性。这种方法的问题在于您还必须使调用者知道要访问对象的向量。