「C/C++」C++ STL容器库 之 std::vector根据下标的批量删除

在这里插入图片描述

✨博客主页
何曾参静谧的博客(✅关注、👍点赞、⭐收藏、🎠转发)
📚全部专栏(专栏会有变化,以最新发布为准)
「Win」Windows程序设计「IDE」集成开发环境「定制」定制开发集合
「C/C++」C/C++程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「UG/NX」BlockUI集合
「Py」Python程序设计「Math」探秘数学世界「PK」Parasolid函数说明
「Web」前后端全栈开发「En」英语从零到一👍占位符
「AI」人工智能大模型「书」书籍阅读笔记

对应下标进行批量删除

如果你想通过一个下标数组 indexs 来删除 vec 中的元素,需要注意以下几点:

  1. 下标的有效性:确保 indexs 中的下标值在 vec 的有效范围内。
  2. 删除顺序:如果直接按顺序删除,可能会导致下标失效(因为删除元素后,后面的元素会向前移动)。因此,通常需要从后往前删除。

以下是实现代码:

#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;
}

代码解释:

  1. 排序下标

    • 使用 std::sortindexs 从大到小排序,确保从后往前删除,避免下标失效。
    • 例如,indexs = {1, 2, 3} 排序后变为 {3, 2, 1}
  2. 删除元素

    • 遍历排序后的 indexs,从后往前删除 vec 中的元素。
    • 使用 vec.erase(vec.begin() + idx) 删除指定下标的元素。
  3. 检查下标有效性

    • 在删除前检查下标是否在 vec 的有效范围内(0 <= idx < vec.size())。
  4. 输出结果

    • 删除后,输出 vec 的内容。

输出结果:

1 5 6 7 8 9 10

删除过程:

  • 删除下标 3vec 变为 {1, 2, 3, 5, 6, 7, 8, 9, 10}
  • 删除下标 2vec 变为 {1, 2, 5, 6, 7, 8, 9, 10}
  • 删除下标 1vec 变为 {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>());

何曾参静谧的博客(✅关注、👍点赞、⭐收藏、🎠转发)


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何曾参静谧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值