C++ 如何使用erase()和reverse_iterator从向量中删除元素
给定向量,任务是使用erase()和reverse_iterator从该向量中删除一个元素。
例子:
输入: vector = {1, 4, 7, 10, 13, 16, 19},元素 = 16
输出: 1 4 7 10 13 19
输入: vector = {99, 89, 79, 69, 59},元素 = 89
输出: 99 79 69 59
方法:
- 获取向量和要删除的元素
- 在向量上初始化反向迭代器
- 使用base和erase删除所需的元素
使用base的原因:erase()返回a指向在正向意义上刚刚删除的元素之后的元素的新位置,因此我们不能在使用反向迭代器时使用相同的过程,其中我们要朝反向而不是正向前进。而且,我们不能将反向迭代器传递给erase()函数作为参数,否则它会产生编译错误。
反向迭代器只是反转给定迭代器的方向的迭代器。这些反转的操作在基础迭代器上发生。我们可以使用reverse_iterator::base()函数获取该迭代器。事实上,itr.base()和itr之间的关系是: &*(reverse_iterator(itr))==&*(itr-1)
以下是上述方法的实现:
// C++程序删除向量元素
//使用erase()和反向迭代器
# include <iostream>
# include <vector>
使用命名空间std;
//从vector 'vec'删除元素'num'的函数
vector<int> delete_ele(vector<int> vec, int num)
{
// 在向量上初始化反向迭代器
vector<int>::reverse_iterator itr1;
for (itr1 = vec.rbegin(); itr1 < vec.rend(); itr1++) {
if (*itr1 == num) {
//删除元素=16
vec.erase((itr1 + 1).base());
}
}
return vec;
}
//驱动程序
int main()
{
vector<int> vec = { 1, 4, 7, 10, 13, 16, 19 };
//我们想删除元素=16
int num = 16;
vector<int>::iterator itr1;
cout << "Vector原本:\n";
for (itr1 = vec.begin(); itr1 < vec.end(); itr1++) {
//打印向量的原始元素
cout << *itr1 << " ";
}
cout << "\n\n要删除的元素:"
<< num << "\n\n";
//重新初始化向量'vec'
//从向量中删除'num'
//并保持其他剩余
//元素不变
vec = delete_ele(vec, num);
vector<int>::iterator itr2;
cout << "删除后的向量:\n";
for (itr2 = vec.begin(); itr2 < vec.end(); itr2++) {
//打印向量的其他剩余元素
cout << *itr2 << " ";
}
return 0;
}
// 本代码由supratik_mitra贡献
原向量:
1 4 7 10 13 16 19
要删除的元素:16
删除后的向量:
1 4 7 10 13 19