📅  最后修改于: 2023-12-03 14:52:02.966000             🧑  作者: Mango
在使用C++ STL的vector容器时,经常需要对其中的元素进行删除或修改等操作。本文将介绍如何使用Erase()函数和reverse_iterator迭代器来从vector中删除元素。
vector的Erase()函数用于删除vector中一个或多个元素。其基本语法如下所示:
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
其中,第一个函数用于删除指定位置的元素,第二个函数用于删除[first, last)区间内的所有元素。
具体实现代码如下所示:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = { 1, 2, 3, 4, 5, 6 };
// 删除指定位置的元素
v.erase(v.begin() + 2);
// 删除区间内的元素
v.erase(v.begin() + 2, v.begin() + 4);
// 打印删除后的vector
for (auto i : v) cout << i << " ";
cout << endl;
return 0;
}
上述代码中,v.erase(v.begin() + 2)删除了第3个元素,即数值为3的元素;v.erase(v.begin() + 2, v.begin() + 4)删除了第3个和第4个元素,即数值为3和4的元素。最后,通过for循环遍历删除后的vector,输出结果为:1 2 5 6。
需要注意的是,erase()函数会改变vector的大小和迭代器的有效性,因此需要避免使用已失效的迭代器。此外,删除元素后,后面的元素会向前移动,因此以下代码是错误的:
for (auto it = v.begin(); it != v.end(); it++) {
if (...) {
v.erase(it);
}
}
正确的做法是使用迭代器的后缀形式,如下所示:
for (auto it = v.begin(); it != v.end(); ) {
if (...) {
it = v.erase(it);
} else {
it++;
}
}
在删除元素时,如果按照从前往后的顺序删除,会使得后面的元素向前移动,从而影响效率。此时,可以使用reverse_iterator(反向迭代器)来从后往前删除元素。
reverse_iterator是一个逆向迭代器,使用方式与普通迭代器相似,但是可以从后往前遍历容器。它有两个重要函数:rbegin()和rend(),用于获取反向迭代器的开始和结束位置。
下面是使用reverse_iterator从vector中删除元素的示例代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = { 1, 2, 3, 4, 5, 6 };
auto rit = v.rbegin();
while (rit != v.rend()) {
if (...) {
// 删除该元素
auto it = rit.base();
it--;
v.erase(it);
}
rit++;
}
// 打印删除后的vector
for (auto i : v) cout << i << " ";
cout << endl;
return 0;
}
上述代码中,使用reverse_iterator(rit)从后往前遍历vector,判断需要删除的元素后,让it指向该元素的正向迭代器,再使用erase()函数删除该元素。
需要注意的是,base()函数可以将reverse_iterator转换为普通迭代器,因此it指向的是被删除元素的后一个元素。最后,通过for循环遍历删除后的vector,输出结果为:1 3 5。
本文介绍了使用Erase()函数和reverse_iterator从vector中删除元素的方法。使用Erase()函数时,需要注意迭代器的有效性和后缀形式。使用reverse_iterator时,可以避免从前往后删除元素时出现的性能问题。