2
class LargeClass
{}

void FunctionA(const LargeClass&) {}

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

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

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

有没有更好的解决方案?

4

2 回答 2

4

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

Avector的迭代器在vector重新分配时变得无效,这可能发生在您将元素添加到vector. 此外,当您erase从 a 中获取一个项目时vector,移除点及之后的所有迭代器都将失效。

这一切都很复杂,最好不要担心。如果您需要迭代器永远不会失效(只要您不删除项目本身),avector可能不是您使用的最佳集合。相反,您可能会考虑 a list、 amap或其他集合。请注意,每个都有自己的权衡取舍。

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

std::vector<shared_ptr<LargeClass>>

最后,如果您真的需要使用 avector并且不想弄乱智能指针,那么最好不要跟踪对 中的项目的“引用” vector,而是跟踪它们的索引位置。假设您要在 处跟踪项目vecLargeClass[3]。即使你做了一些使迭代器无效的事情,有问题的项目仍然在 index 3。与其跟踪interators 或指向事物的指针,不如跟踪它们在vector.

于 2012-11-07T17:17:56.893 回答
0

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

于 2012-11-07T17:13:35.303 回答