智能指针作为一种封装了指针的类,可以帮助程序员降低出现程序异常的风险。它主要有两种类型:shared_ptr 和 unique_ptr。其中,shared_ptr 是共享所有权的智能指针,可以实现内存共享并且会自动删除内存。unique_ptr 则是独占所有权的智能指针,不能进行内存共享,但是可以更加安全地传递所有权。
在使用智能指针时,我们经常会遇到需要 erase 的情况。比如,在使用 shared_ptr 时,当我们需要从一个 std::vector
那么,如何 erase 一个智能指针呢?下面我们分别介绍 shared_ptr 和 unique_ptr 的 erase 方法。
1. 如何 erase shared_ptr?
对于 shared_ptr,我们常用 std::remove_if 和 std::erase 来删除 shared_ptr。具体步骤如下:
```
std::vector
std::make_shared(2),
std::make_shared(3)};
// 删除值等于 2 的元素
v.erase(std::remove_if(v.begin(), v.end(),
[](std::shared_ptr p) { return *p == 2; }),
v.end());
```
在上面的代码中,我们首先定义了一个 std::vector,其中包含了三个 std::shared_ptr,然后我们使用 std::remove_if 函数来返回由第二个参数到第三个参数范围中,满足第一个参数条件的迭代器。最后,我们使用 std::erase 函数将返回的迭代器范围的所有元素从容器中删除。
2. 如何 erase unique_ptr?
对于 unique_ptr,我们可以使用一个名为 smart_erase 的辅助函数进行删除。这个函数内部实现了 std::move、std::find_if 和 std::erase 等函数,代码如下:
```
template
void smart_erase(C& c, const V& value) {
c.erase(std::remove_if(c.begin(), c.end(),
[&value](const std::unique_ptr& ptr) {
return *ptr == value;
}), c.end());
}
```
以上代码定义了一个名为 smart_erase 的模板函数。其中,其第一个参数是一个可修改的容器(C)的引用,第二个参数(V)是你要删除的值。smart_erase 函数内部使用了 std::remove_if 函数找到要删除的 unique_ptr,并调用 std::erase 函数进行删除。
总结:
本文主要讲解了如何 erase 一个智能指针,包括 shared_ptr 和 unique_ptr 两种情况下的方法。智能指针可以自动帮我们管理内存,降低程序异常的风险。而正确地使用 erase 函数,也能够帮助我们更加智能地处理指针。如果您还不熟悉智能指针,请先了解它的基本概念。