You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从std::vector中选取除指定索引元素外的所有元素

实现std::vector排除指定索引元素的方法

给定存储int类型元素的std::vector,例如std::vector vec{10, 20, 30},需要获取排除指定索引对应元素后的新向量,比如指定索引int i=1时,期望结果为std::vector {10, 30},可通过以下几种常用方式实现:

方法1:分段拷贝(性能最优)

该方法无逐元素判断开销,利用vector内存连续的特性,将指定索引前后的两段连续区间直接拼接为新vector,时间复杂度O(n),常数开销最低,是工程上优先选择的实现。

#include <vector>

std::vector<int> get_elements_without_index(const std::vector<int>& origin, int skip_idx) {
    std::vector<int> result;
    // 提前预留内存,避免动态扩容的额外开销
    result.reserve(origin.size() - 1);
    // 插入指定索引前的所有元素
    result.insert(result.end(), origin.begin(), origin.begin() + skip_idx);
    // 插入指定索引后的所有元素
    result.insert(result.end(), origin.begin() + skip_idx + 1, origin.end());
    return result;
}

// 调用示例
int main() {
    std::vector vec{10, 20, 30};
    int skip_index = 1;
    auto res = get_elements_without_index(vec, skip_index); // 返回结果为{10, 30}
    return 0;
}

注意:使用前需要校验传入的skip_idx是否在合法范围[0, origin.size() - 1]内,非法索引会导致迭代器越界,触发内存访问错误。

方法2:遍历判断跳过(写法直观易维护)

逐元素遍历原vector,仅将索引不等于跳过值的元素插入新vector,逻辑直白不容易写错,适合小数据量、代码可读性优先的场景。

#include <vector>

std::vector<int> get_elements_without_index(const std::vector<int>& origin, int skip_idx) {
    std::vector<int> result;
    result.reserve(origin.size() - 1);
    for (int idx = 0; idx < origin.size(); ++idx) {
        if (idx != skip_idx) {
            result.push_back(origin[idx]);
        }
    }
    return result;
}

方法3:C++20范围视图(零拷贝,适合只读遍历场景)

如果不需要生成独立的新vector,仅需要遍历排除指定索引后的元素,可以使用C++20的范围库拼接视图,不需要拷贝任何元素,内存开销为0。

#include <vector>
#include <ranges>

int main() {
    std::vector vec{10, 20, 30};
    int skip_index = 1;
    auto skipped_view = std::views::take(vec, skip_index) 
        | std::views::concat(std::views::drop(vec, skip_index + 1));
    
    // 直接遍历视图即可,依次得到10、30
    for (int num : skipped_view) {
        // 业务逻辑
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Sengiley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:18:22