iterator erase(iterator first, iterator last)实现
时间: 2023-06-18 16:06:33 浏览: 60
`std::vector` 和 `std::list` 都提供了 `erase()` 函数用于删除元素。其函数原型为:
```c++
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
```
其中,`erase(position)` 会删除迭代器 `position` 所指向的元素,并返回指向被删除元素的下一个元素的迭代器;而 `erase(first, last)` 会删除从迭代器 `first` 到迭代器 `last`(不包括 `last`)所指向的所有元素,返回指向被删除元素的下一个元素的迭代器。
下面是 `erase(first, last)` 的简单实现,以 `std::vector` 为例:
```c++
template <typename T>
typename std::vector<T>::iterator erase(typename std::vector<T>::iterator first, typename std::vector<T>::iterator last) {
auto size = std::distance(first, last); // 计算需要删除的元素个数
auto next = last; // 保存被删除元素的下一个元素的迭代器
while (first != last) {
first = vec.erase(first); // 删除元素,并返回下一个元素的迭代器
}
return next;
}
```
以上代码中,`std::distance(first, last)` 函数用于计算迭代器 `first` 和迭代器 `last` 之间的距离,即需要删除的元素个数。然后,我们在循环中调用 `vec.erase()` 函数删除元素,并将返回的下一个元素的迭代器保存在 `next` 变量中,最后返回它即可。
需要注意的是,由于 `std::vector` 的 `erase()` 函数可能会使得指向容器其他元素的迭代器、指针和引用失效,因此在循环中我们不能直接使用 `first++`,而要使用 `first = vec.erase(first)` 来更新迭代器 `first`。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)