C++ C++;如何同时删除位于两个向量中的两个指针?

C++ C++;如何同时删除位于两个向量中的两个指针?,c++,pointers,vector,C++,Pointers,Vector,我有两个向量,两个向量中都加了一个指针。我要做的是将int*指针添加到两个向量,然后删除指针。我希望删除每个向量中的指针。这是C++中不可能迭代的向量吗?< /P> std::vector<int *> A; std::vector<int *> B: int * ptr = new int(5); A.push_back(ptr); // Add ptr to list A. B.push_back(ptr); // Add ptr to list B. // righ

我有两个向量,两个向量中都加了一个指针。我要做的是将int*指针添加到两个向量,然后删除指针。我希望删除每个向量中的指针。这是C++中不可能迭代的向量吗?< /P>
std::vector<int *> A;
std::vector<int *> B:
int * ptr = new int(5);
A.push_back(ptr); // Add ptr to list A.
B.push_back(ptr); // Add ptr to list B.
// right here is where I want to delete pointer and update the vectors.
// A and B vector size should be 0 after the delete.
delete ptr;
std::向量A;
标准::向量B:
int*ptr=新的int(5);
A.向后推(ptr);//将ptr添加到列表A中。
B.向后推(ptr);//将ptr添加到列表B中。
//这里是我想要删除指针和更新向量的地方。
//删除后,A和B向量大小应为0。
删除ptr;
我知道我可以迭代这两个向量并手动删除元素,但这会在一个巨大的列表中增加很多时间。我假设我也可以做一个检查,看看a[I]==NULL

我希望删除每个向量中的指针。这是C++中不可能迭代的向量吗?< /P>
std::vector<int *> A;
std::vector<int *> B:
int * ptr = new int(5);
A.push_back(ptr); // Add ptr to list A.
B.push_back(ptr); // Add ptr to list B.
// right here is where I want to delete pointer and update the vectors.
// A and B vector size should be 0 after the delete.
delete ptr;
不,不是。但是,您不必手动迭代,您可以使用STL算法,例如:

A.erase(std::remove(A.begin(), A.end(), ptr), A.end());
B.erase(std::remove(B.begin(), B.end(), ptr), B.end());
或:

我假设我也可以做一个检查,看看
a[I]==NULL


由于未在向量中存储任何空指针,因此您的假设不正确。

您使用的是原始指针,因此确保正确清理的责任完全在您身上。您将它们存储到向量中,这意味着您不能假设迭代器或指向该存储的指针的一致性,如果向量在检查之间可能发生了变化

std::vector<int *> A;
std::vector<int *> B:
int * ptr = new int(5);
A.push_back(ptr); // Add ptr to list A.
B.push_back(ptr); // Add ptr to list B.
// right here is where I want to delete pointer and update the vectors.
// A and B vector size should be 0 after the delete.
delete ptr;
因此,迭代搜索是您在这里的唯一选择

如果这些规则中的任何一条可以更改:

使用集合而不是向量会增加插入成本,但会减少对移除成本的检查。如果这两项任务是平衡的,这可能是不值得的


切换到
shared_ptr
来保存分配的对象和数组中的
weak_ptr
s将意味着您不必预先删除;遍历列表只需要检查每个
weak\u ptr
s是否仍然有一个主题。

有一个标准类可以这样做,
weak\u ptr

std::vector<std::weak_ptr<int>> A;
std::vector<std::weak_ptr<int>> B:
auto ptr = std::make_shared(5);
A.push_back(ptr); // Add ptr to list A.
B.push_back(ptr); // Add ptr to list B.
// right here is where I want to delete pointer and update the vectors.
ptr = nullptr;
// A and B vector size are 1; both A[0] and B[0] are .expired()
std::向量A;
标准::向量B:
自动ptr=std::使_共享(5);
A.向后推(ptr);//将ptr添加到列表A中。
B.向后推(ptr);//将ptr添加到列表B中。
//这里是我想要删除指针和更新向量的地方。
ptr=nullptr;
//A和B向量大小为1;A[0]和B[0]都已过期()

弱ptr
共享ptr
协同工作。您可以从一个转换到另一个,然后再转换回来。区别在于
shared\u ptr
使指向的对象保持活动状态
weak_ptr
只能检查对象是否仍处于活动状态,这意味着至少有一个
shared_ptr
指向同一对象。

删除向量之前,需要将指针从向量中移除(即使是在单个向量的情况下)。一种方法是使用vector的
查找
擦除
。最好首先不要使用具有所有权语义的原始指针。
std::vector
没有
find()
方法,您必须使用
std::find()
。我假设我还可以检查[I]==NULL?释放内存后,它不会为空,删除也不会神奇地改变存储在任一向量中的值。除非您删除旧指针,否则它仍将存在(指向不再拥有的内存)。这背后的设计原理是什么?为什么需要将原始指针存储在
std::vector
中,然后删除它们?这种方法存在一些问题,包括异常安全。如果确实必须存储动态分配的对象,请使用智能指针,如
std::unique\u ptr
std::shared\u ptr