- C++
vector erase教程 注释 示例
- 2025-3-25 18:41:09 @
在C++中,std::vector
的erase
函数用于从vector
中删除指定的元素或元素范围,它有两种常见的重载形式,下面为你详细介绍:
1. 移除单个元素
- 函数原型:
iterator erase(iterator position);
- 功能:删除
vector
中position
迭代器所指向的元素。删除后,该位置后面的元素会向前移动,填补删除元素的空位。函数返回一个迭代器,指向删除元素之后的第一个元素。如果删除的是最后一个元素,则返回vector.end()
。 - 示例代码:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 要删除第三个元素(索引为2)
std::vector<int>::iterator it = numbers.begin() + 2;
numbers.erase(it);
// 输出删除元素后的vector
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
- 代码解释:先创建一个包含整数的
vector
,通过numbers.begin() + 2
获取指向要删除元素的迭代器,然后调用erase
函数删除该元素,最后遍历输出删除元素后的vector
,输出结果为1 2 4 5
。
2. 移除指定范围内的元素
- 函数原型:
iterator erase(iterator first, iterator last);
- 功能:删除
vector
中从first
迭代器(包含)到last
迭代器(不包含)之间的所有元素。删除后,last
后面的元素会向前移动。函数返回一个迭代器,指向最后一个被删除元素之后的第一个元素。 - 示例代码:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 删除索引为1到3(不包含3)之间的元素,即删除2和3
std::vector<int>::iterator first = numbers.begin() + 1;
std::vector<int>::iterator last = numbers.begin() + 3;
numbers.erase(first, last);
// 输出删除元素后的vector
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
- 代码解释:创建
vector
后,分别获取要删除范围的起始和结束迭代器first
和last
,调用erase
函数删除范围内的元素,最终输出结果为1 4 5
。
注意事项
- 迭代器失效:在使用
erase
函数后,指向被删除元素及其后面元素的迭代器都会失效。因此,在循环中使用erase
时,需要正确处理迭代器,避免错误。例如,常见的错误用法:
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 3, 4};
for (auto it = vec.begin(); it != vec.end(); ++it) {
if (*it == 3) {
vec.erase(it); // 这里it在erase后失效,继续++会出错
}
}
return 0;
}
- 正确的处理方式:利用
erase
函数的返回值更新迭代器,如:
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 3, 4};
for (auto it = vec.begin(); it != vec.end();) {
if (*it == 3) {
it = vec.erase(it); // 使用返回值更新迭代器
} else {
++it;
}
}
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
- 与
remove
算法结合:当需要删除vector
中所有满足特定条件的元素时,可以结合std::remove
算法和erase
函数,这种方式更高效,称为remove-erase
惯用法。示例如下:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {1, 2, 3, 3, 4};
// remove算法将待删除元素(这里是3)移动到容器末尾,返回指向新的逻辑末尾的迭代器
auto new_end = std::remove(nums.begin(), nums.end(), 3);
// 使用erase删除逻辑末尾之后的元素
nums.erase(new_end, nums.end());
for (int num : nums) {
std::cout << num << " ";
}
return 0;
}
在上述代码中,std::remove
算法不会真正删除元素,而是将满足条件的元素移到容器末尾,返回一个迭代器指向新的逻辑末尾,然后再用erase
函数删除逻辑末尾之后的元素 ,最终输出结果为1 2 4
。
0 条评论
目前还没有评论...