std::vector 是 C++ 标准库中的一个动态数组容器,它提供了在运行时动态增长和缩小的能力。当需要从 vector 中删除多个元素时,有几种不同的方法可以选择。
这是从 vector 中删除多个元素的最常用和最有效的方法。
#include <vector>
#include <algorithm>
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 删除所有等于3或5的元素
vec.erase(std::remove_if(vec.begin(), vec.end(),
[](int x) { return x == 3 || x == 5; }),
vec.end());
#include <vector>
#include <algorithm>
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 删除所有大于5的元素
vec.erase(std::remove_if(vec.begin(), vec.end(),
[](int x) { return x > 5; }),
vec.end());
如果需要按索引删除多个元素,可以先对索引排序,然后从后向前删除:
#include <vector>
#include <algorithm>
std::vector<int> vec = {10, 20, 30, 40, 50, 60, 70, 80, 90};
std::vector<size_t> indices = {1, 3, 5}; // 要删除的索引
// 确保索引按降序排列
std::sort(indices.begin(), indices.end(), std::greater<size_t>());
for (auto i : indices) {
if (i < vec.size()) {
vec.erase(vec.begin() + i);
}
}
#include <vector>
#include <algorithm>
std::vector<int> vec = {1, 2, 3, 2, 5, 2, 7, 8, 2};
// 删除所有值为2的元素
vec.erase(std::remove(vec.begin(), vec.end(), 2), vec.end());
原因:在循环中使用 erase 会导致迭代器失效 解决方案:使用 erase-remove 惯用法或更新迭代器
// 错误示例
for (auto it = vec.begin(); it != vec.end(); ++it) {
if (*it == value) {
vec.erase(it); // 错误!it 失效
}
}
// 正确示例
for (auto it = vec.begin(); it != vec.end(); ) {
if (*it == value) {
it = vec.erase(it); // erase 返回下一个有效迭代器
} else {
++it;
}
}
原因:没有正确处理 erase 的返回值或没有使用正确的范围 解决方案:确保 erase 的范围正确,并检查 size() 结果
// 正确使用 erase-remove
auto new_end = std::remove(vec.begin(), vec.end(), value);
vec.erase(new_end, vec.end()); // 确保删除所有匹配元素
解决方案:为自定义类型提供适当的比较操作
struct Person {
std::string name;
int age;
};
std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 30}};
// 删除所有年龄为30的人
people.erase(std::remove_if(people.begin(), people.end(),
[](const Person& p) { return p.age == 30; }),
people.end());
从 std::vector 中删除多个元素时,erase-remove 惯用法是最推荐的方法,它高效且安全。根据具体需求,可以选择按值删除、按条件删除或按索引删除。始终要注意迭代器失效问题,并考虑使用算法库中的函数来提高代码的简洁性和性能。
没有搜到相关的文章