如何从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
相关产品推荐
相关产品推荐

