如果指针指向矢量的最后一个元素,并且我想删除元素但是通过指针保存数据,我该怎么办?
vector<int> a;
a.push_back(1);
int * b = a[0];
a.pop_back(); //b is invalidated
我被迫使用不同的容器还是有其他方式?
答案 0 :(得分:2)
从问题看来,您似乎特别希望将指针保留为从容器中删除的元素。所有容器使指针和对已擦除对象的引用无效。如果您需要从容器中擦除对象但保持指向对象的活动,唯一可行的标准库容器是std::list<T>
:您可以splice()
将对象放入不同的列表中:
std::list<int> a;
std::list<int> removed;
a.push_back(1);
int* b = &a.front();
a.splice(a.begin(), removed);
在此操作之后,b
指向的对象不在a
中,而是在removed
中。
答案 1 :(得分:2)
向量保留数据的内部副本,因此您通常不能依赖指向内部数据的指针(push_back或pop_back可能会使它们无效)。您可以在代码中复制int b = a[0];
,或在向量中存储指针而不是值。请注意,在后一种情况下,您需要小心内存管理,例如使用vector<unique_ptr<T>>
。