好吧,我不知道是否可能,但事情是: struct stPiece{ /* some stuff */ stPiece *mother; // pointer to the piece that created this one};vectorstPiece pieces; 是否可以将“母亲”引用的作品从片段中删除,仅将该指针
struct stPiece { /* some stuff */ stPiece *mother; // pointer to the piece that created this one }; vector<stPiece> pieces;
是否可以将“母亲”引用的作品从片段中删除,仅将该指针作为参考?怎么样?
它会混淆其他参考吗? (即如果它不是向量中的最后一个元素,则通过将下一个元素移动到其他存储位置,而另一个’*母亲’保持不变).当然,我假设所有子片段都将被删除(因此我不需要更新任何指向同一母亲的指针).
谢谢!
如果你的母指针直接指向碎片矢量的元素,你将遇到各种麻烦.从片段中删除元素将在更高的索引处移动元素的所有位置.即使插入元素也会使所有指针无效,因为向量可能需要重新分配它的内部数组,这可能会将所有元素转移到内存中的新位置.
回答你的主要问题:你不能直接删除指针所在的元素,首先需要通过向量搜索来找到它,或者在向量中计算它的索引.
不将指针存储为碎片作为母亲,而是元素的索引将使其更加健壮,因此至少插入新元素不会破坏现有的母亲.但是从碎片中删除仍会将元素转移到新索引.
使用std::list
作为片段并将迭代器存储到母亲可能是一个解决方案.如果删除/添加该列表中的其他元素,则std :: list的迭代器不会失效.如果不同的元素可以拥有相同的母亲,你仍然有一个问题,找出何时删除母元素,比使用boost::shared_ptr
更简单.