有没有更好的方法来删除存储在vector中的元素的原始指针引用

时间:2012-11-07 17:10:34

标签: c++ stl

class LargeClass
{}

void FunctionA(const LargeClass&) {}

std::vector<LargeClass> vecLargeClass; // populate vecLargeClass

const LargeClass* prev = vecLargeClass[0];
for( ... )
{
    ...
    if(...)
       prev = &vecLargeClass[i];
}

我需要保持对向量中存储的元素的引用。 为了避免复制,我目前使用原始指针。或者我可以存储指向元素的索引。

对此有更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

,只要vector的迭代器无效,您就可以对vector中的元素保持“引用”。这是一个很大的警告。

vector的迭代器在重新分配vector时失效,这可能在您向vector添加元素时发生。此外,当erase来自vector的项目时,删除点以及超出删除点的所有迭代器都将失效。

这一切都非常复杂,最好不要担心。如果您需要迭代器永远不会失效(只要您不删除那个项本身),vector可能不是您使用的最佳集合。相反,您可以考虑使用listmap或其他集合。请注意,每个都有自己的一组权衡。

但是,您可能根本不需要关心迭代器。如果你的vector本身不存储项目,而是指向项目的指针,那么即使向量被重新分配,指针指向的东西也不会移动。走这条路线,当然你应该尽可能使用智能指针。从表面上看,最好的一个似乎是shared_ptr。所以你的退场成为:

std::vector<shared_ptr<LargeClass>>

最后,如果你真的需要使用vector并且不想搞乱智能指针,你最好不要跟踪vector中项目的“引用”。 ,但他们的指数位置。假设您要跟踪vecLargeClass[3]处的项目。即使您执行某些操作使迭代器无效,相关项仍将位于索引3。不要跟踪interator或指向事物的指针,而是跟踪它们在vector中的位置。

答案 1 :(得分:0)

存储指针或向量元素的引用时要小心。某些操作可能会使这些引用无效,例如push_backresize等。如果索引是您确定不会更改的,那么它将是最安全的。智能指针,如注释中提到的marcin_j,在push_back,resize等情况下无效。