C++ 有没有更好的方法来删除对vector中存储的元素的原始指针引用 class大类 {} 无效函数(常量类&){ std::vector vecLargeClass;//填充向量类 常量类*prev=向量类[0]; 对于(…) { ... 如果(…) prev=&vecLargeClass[i]; }

C++ 有没有更好的方法来删除对vector中存储的元素的原始指针引用 class大类 {} 无效函数(常量类&){ std::vector vecLargeClass;//填充向量类 常量类*prev=向量类[0]; 对于(…) { ... 如果(…) prev=&vecLargeClass[i]; },c++,stl,C++,Stl,我需要保留对向量中存储的元素的引用。 为了避免复制,我目前使用原始指针。或者我可以存储一个指向元素的索引 有更好的解决方案吗?存储指向向量元素的指针或引用时要小心。某些操作可能会使这些引用无效,例如向后推,调整大小,等等。如果索引是您确定不会更改的,那么它将是最安全的。如marcin_j在评论中所述,智能指针在回推、调整大小等情况下无助于失效。存储指针或对向量元素的引用时要小心。某些操作可能会使这些引用无效,例如向后推,调整大小,等等。如果索引是您确定不会更改的,那么它将是最安全的。如marci

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


有更好的解决方案吗?

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

存储指针或对向量元素的引用时要小心。某些操作可能会使这些引用无效,例如
向后推
调整大小
,等等。如果索引是您确定不会更改的,那么它将是最安全的。如marcin_j在评论中所述,智能指针在推回、调整大小等情况下不会帮助无效。

,只要
向量
的迭代器没有无效,您可以保留对
向量
中元素的“引用”。这是一个很大的警告

当重新分配
向量时,
向量的迭代器将失效,这可以在向
向量添加元素时发生。此外,当您从
向量
中删除
项时,删除点及其以外的所有迭代器都将无效

这一切都很复杂,最好不要担心。如果您需要迭代器永远不会失效(只要您不删除该项本身),那么
向量可能不是您使用的最佳集合。相反,您可以考虑<代码>列表<代码>、<代码> map <代码>或其他集合。请注意,每种方法都有自己的折衷方案

然而,您可能根本不需要关心迭代器。如果
vector
存储的不是项目本身,而是指向项目的指针,那么即使向量被重新分配,指针指向的东西也不会移动。走这条路,当然,如果可能的话,你应该使用智能指针。从表面上看,最好的方法似乎是
shared\u ptr
。因此,您的delcaration成为:

class LargeClass
{}

void FunctionA(const LargeClass&) {}

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

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

最后,如果您确实需要使用
向量
,并且不想弄乱智能指针,那么最好不要跟踪
向量
中项目的“引用”,而是跟踪它们的索引位置。假设您希望跟踪位于
vecLargeClass[3]
的项。即使您做了一些使迭代器无效的事情,有问题的项仍将位于索引
3
。与其跟踪
interator
或指向事物的指针,不如跟踪它们在
向量
中的位置

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

当重新分配
向量时,
向量的迭代器将失效,这可以在向
向量添加元素时发生。此外,当您从
向量
中删除
项时,删除点及其以外的所有迭代器都将无效

这一切都很复杂,最好不要担心。如果您需要迭代器永远不会失效(只要您不删除该项本身),那么
向量可能不是您使用的最佳集合。相反,您可以考虑<代码>列表<代码>、<代码> map <代码>或其他集合。请注意,每种方法都有自己的折衷方案

然而,您可能根本不需要关心迭代器。如果
vector
存储的不是项目本身,而是指向项目的指针,那么即使向量被重新分配,指针指向的东西也不会移动。走这条路,当然,如果可能的话,你应该使用智能指针。从表面上看,最好的方法似乎是
shared\u ptr
。因此,您的delcaration成为:

class LargeClass
{}

void FunctionA(const LargeClass&) {}

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

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

最后,如果您确实需要使用
向量
,并且不想弄乱智能指针,那么最好不要跟踪
向量
中项目的“引用”,而是跟踪它们的索引位置。假设您希望跟踪位于
vecLargeClass[3]
的项。即使您做了一些使迭代器无效的事情,有问题的项仍将位于索引
3
。与其跟踪
interator
或指向对象的指针,不如跟踪它们在
向量中的位置

假设向量在循环中未修改。假设向量在循环中未修改。因为他首先使用索引定位元素,这是存储位置的明显方法。但是,即使他使用迭代器,
pos-vecLargeClass.begin()
也会给他插入保存索引。因为他首先使用索引来定位元素,所以这是存储位置的明显方法。然而,即使他使用的是迭代器,
pos-vecLargeClass.begin()
会给他插入保存索引。您之所以喜欢使用
std::vector
是因为vector中的复制操作比
std::vector
的复制操作要快,因为前者只涉及指针操作。@q0987:这是个问题吗?如果是这样的话,我不确定我是否理解你的要求。我只是想知道为什么