我有两个向量,两个向量中都添加了一个指针。我想做的是将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吗?
答案 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_ptr
和shared_ptr
一起工作。您可以从一种转换为另一种,然后再转换回来。区别在于shared_ptr
使指向对象保持活动状态。 weak_ptr
只能检查对象是否仍在活动,这意味着同一对象至少有一个shared_ptr
。