我目前有一个类的 vector Foo
和另一个指向 Foo
子集的指针 vector 在 vector 中。我目前有一个函数可以从 vector<Foo *>
中选择一些指针。并从 vector<Foo>
中删除它们实际上包含它们。因此,一开始,这两个 vector 看起来像这样:
//Foo classes in vector<Foo>
a
b
c
d
和
//Foo pointers in vector<Foo *>
*a
*b
*c
*d
但是,我发现在删除 Foo
之后,说 b
,它们看起来像这样:
//Foo classes in vector<Foo>
a
c
d
和
//Foo pointers in vector<Foo *>
*a
*c
*d
*d
指针怎么会指向c
在vector<Foo *>
不会一直指向 c
在 b
之后在 vector<Foo>
中被删除?有什么办法可以解决这个问题吗?
(我知道如果我删除 b
,指向 b
的原始指针将是悬空的;但是,由于我不打算在删除后访问 b
,我认为它不会问题,我可以使用指向 c
的指针转到下一个索引)
编辑:
根据要求,填充指针 vector 的代码:
for(int i = 0; i < a.size(); i++) //a is the vector<Foo>
{
Foo * thisFoo = &a[i];
if(someConditionMet)
b.push_back(thisFoo); //b is the vector<Foo *>
}
最佳答案
vector
将其元素存储在数组中。数组是元素的连续序列。
如果您有一个包含元素 a、b、c、d
的 vector
并删除元素 b
,则元素 c
和 d
在数组中向下移动一个索引以填充由删除的元素创建的空洞,留下一个包含 a, c, d
的数组。
指针在移动时不会“跟随”vector
中的元素。如果您有一个“指向 c
”的指针,那么该指针实际上指向“数组中索引 2
处的元素”。当您从数组中删除 b
时,“索引 2
处的元素”就是 d
,而不是 c
。
如果你想让一个对象有一个固定的地址永远不会改变,你应该自己动态分配它并使用智能指针跟踪它(比如unique_ptr
或shared_ptr
) .
关于c++ - 指针实际上并不指向对象本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7135838/