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

时间:2018-06-19 22:16:56

标签: c++ pointers vector

我有两个向量,两个向量中都添加了一个指针。我想做的是将int *指针添加到两个向量,然后删除该指针。我希望在每个向量中删除指针。在C ++中可以做到这一点而无需遍历向量。

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;

我知道我可以遍历两个向量并手动删除元素,但这会在大量列表中增加大量时间。我假设我也可以检查A [i] == NULL吗?

3 个答案:

答案 0 :(得分:4)

  

我希望在每个向量中删除指针。在C ++中可以做到这一点而无需遍历向量。

不,不是。但是,您不必手动进行迭代,可以改用STL算法,例如:

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

或者:

auto iter = std::find(A.begin(), A.end(), ptr);
if (iter != A.end()) A.erase(iter);

auto iter = std::find(B.begin(), B.end(), ptr);
if (iter != B.end()) B.erase(iter);
  

我假设我也可以进行检查以查看是否A[i] == NULL

您假设不正确,因为您没有在向量中存储任何NULL指针。

答案 1 :(得分:1)

您使用的是原始指针,因此完全由您自己承担责任以确保正确清理。您将它们存储在向量中,这意味着如果向量在两次检查之间发生突变,则无法假定迭代器或指向该存储的指针的一致性。

因此,迭代搜索是您唯一的选择。

如果其中任何规则可以更改:

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

切换到shared_ptr来将分配的对象和weak_ptr保留在数组中将意味着您不必倾向于预先删除;遍历您的列表仅需要检查每个weak_ptr仍然有一个主题。

答案 2 :(得分:0)

weak_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()

weak_ptrshared_ptr一起工作。您可以从一种转换为另一种,然后再转换回来。区别在于shared_ptr使指向对象保持活动状态。 weak_ptr只能检查对象是否仍在活动,这意味着同一对象至少有一个shared_ptr