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

C++ 将根层次结构的对象存储在向量中,c++,pointers,reference,invalidation,C++,Pointers,Reference,Invalidation,我有一个数组,每个对象都有一个指向其父类型的指针。根对象是一个仅移动的类(它有一个move-ctor和move-assignment操作符,但没有默认的ctor或assignment)。问题是当向量增长时,我得到了无效的指针。对我来说,使用列表并不是一个好的解决方案 我正在寻找任何改变当前设计的解决方案。如果您事先知道要存储的对象数量,可以使用std::vector::reserve成员函数来确保不会重新分配内存。这还可以提高性能,因为它提供了更好的引用位置 如果您事先不知道对象的数量,而不是将

我有一个数组,每个对象都有一个指向其父类型的指针。根对象是一个仅移动的类(它有一个move-ctor和move-assignment操作符,但没有默认的ctor或assignment)。问题是当向量增长时,我得到了无效的指针。对我来说,使用列表并不是一个好的解决方案


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

如果您事先知道要存储的对象数量,可以使用
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));
std::向量容器;
std::unique_ptr对象(新对象(/**/);
container.push_back(std::move(object));

作为最后的手段,您可以使用索引来代替指针,从而在过程中获得良好的引用位置。这种方法的问题是,您还必须让想要访问对象的调用方知道向量。

不清楚如何将对象存储在向量中。您是存储指针还是存储对象然后使用它们的指针?@Veritas我存储的是对象,而不是指向它们的指针。如果您还关心缓存,这很棘手。看我的答案。你能把索引存储到父对象而不是指针,并在修改向量之前相应地更新它们吗?如果这是经常发生的事情,那么友好可能是不值得的。您能否以堆的方式安排父/子对象之间的关系?多态对象应该通过指针或仅通过引用进行操作和存储。仅移动、仅复制、不复制与对象本身相关的不移动都是无关的。你的向量应该只包含几乎可以复制的(智能)指针。。。也许是像一个聪明的指针黑客