class LargeClass
{}
void FunctionA(const LargeClass&) {}
std::vector<LargeClass> vecLargeClass; // populate vecLargeClass
const LargeClass* prev = vecLargeClass[0];
for( ... )
{
...
if(...)
prev = &vecLargeClass[i];
}
我需要保持对向量中存储的元素的引用。 为了避免复制,我目前使用原始指针。或者我可以存储指向元素的索引。
对此有更好的解决方案吗?
答案 0 :(得分:4)
是,只要vector
的迭代器无效,您就可以对vector
中的元素保持“引用”。这是一个很大的警告。
vector
的迭代器在重新分配vector
时失效,这可能在您向vector
添加元素时发生。此外,当erase
来自vector
的项目时,删除点以及超出删除点的所有迭代器都将失效。
这一切都非常复杂,最好不要担心。如果您需要迭代器永远不会失效(只要您不删除那个项本身),vector
可能不是您使用的最佳集合。相反,您可以考虑使用list
,map
或其他集合。请注意,每个都有自己的一组权衡。
但是,您可能根本不需要关心迭代器。如果你的vector
本身不存储项目,而是指向项目的指针,那么即使向量被重新分配,指针指向的东西也不会移动。走这条路线,当然你应该尽可能使用智能指针。从表面上看,最好的一个似乎是shared_ptr
。所以你的退场成为:
std::vector<shared_ptr<LargeClass>>
最后,如果你真的需要使用vector
并且不想搞乱智能指针,你最好不要跟踪vector
中项目的“引用”。 ,但他们的指数位置。假设您要跟踪vecLargeClass[3]
处的项目。即使您执行某些操作使迭代器无效,相关项仍将位于索引3
。不要跟踪interator
或指向事物的指针,而是跟踪它们在vector
中的位置。
答案 1 :(得分:0)
存储指针或向量元素的引用时要小心。某些操作可能会使这些引用无效,例如push_back
,resize
等。如果索引是您确定不会更改的,那么它将是最安全的。智能指针,如注释中提到的marcin_j,在push_back,resize等情况下无效。