对应下标进行批量删除
如果你想通过一个下标数组 indexs
来删除 vec
中的元素,需要注意以下几点:
- 下标的有效性:确保
indexs
中的下标值在vec
的有效范围内。 - 删除顺序:如果直接按顺序删除,可能会导致下标失效(因为删除元素后,后面的元素会向前移动)。因此,通常需要从后往前删除。
以下是实现代码:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> indexs = {1, 2, 3}; // 要删除的下标
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 确保下标是唯一的并排序(从大到小)
std::sort(indexs.begin(), indexs.end(), std::greater<int>());
// 遍历下标,从后往前删除
for (int idx : indexs) {
if (idx >= 0 && idx < vec.size()) { // 检查下标是否有效
vec.erase(vec.begin() + idx);
} else {
std::cerr << "Invalid index: " << idx << std::endl;
}
}
// 输出删除后的 vector
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
代码解释:
-
排序下标:
- 使用
std::sort
将indexs
从大到小排序,确保从后往前删除,避免下标失效。 - 例如,
indexs = {1, 2, 3}
排序后变为{3, 2, 1}
。
- 使用
-
删除元素:
- 遍历排序后的
indexs
,从后往前删除vec
中的元素。 - 使用
vec.erase(vec.begin() + idx)
删除指定下标的元素。
- 遍历排序后的
-
检查下标有效性:
- 在删除前检查下标是否在
vec
的有效范围内(0 <= idx < vec.size()
)。
- 在删除前检查下标是否在
-
输出结果:
- 删除后,输出
vec
的内容。
- 删除后,输出
输出结果:
1 5 6 7 8 9 10
删除过程:
- 删除下标
3
:vec
变为{1, 2, 3, 5, 6, 7, 8, 9, 10}
。 - 删除下标
2
:vec
变为{1, 2, 5, 6, 7, 8, 9, 10}
。 - 删除下标
1
:vec
变为{1, 5, 6, 7, 8, 9, 10}
。
注意事项:
- 如果
indexs
中有重复的下标,可能会导致重复删除或未定义行为。可以在排序前对indexs
去重。 - 如果
indexs
中的下标超出vec
的范围,需要额外处理(如忽略或报错)。
去重版本:
如果 indexs
中可能有重复的下标,可以在排序前去重:
#include <algorithm>
#include <vector>
// 去重
std::sort(indexs.begin(), indexs.end());
indexs.erase(std::unique(indexs.begin(), indexs.end()), indexs.end());
std::sort(indexs.begin(), indexs.end(), std::greater<int>());
何曾参静谧的博客(✅关注、👍点赞、⭐收藏、🎠转发)