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

二维std::vector限幅拷贝:列维度不固定时的最优实现方式

解决二维std::vector列维度不固定时的限值过滤拷贝问题

你的原代码核心问题在于默认所有行的列数和第一行一致,但实际每行长度可能不同,甚至输入为空时访问input[0]会直接崩溃。正确的做法是逐行处理输入的每一行,为输出的每一行单独初始化对应长度的vector,具体实现可以参考以下几种方式:

方式一:直观逐行遍历(推荐,易读且高效)

#include <vector>

// 建议把min_value和max_value作为参数传入,避免依赖全局变量
[[nodiscard]] std::vector<std::vector<double>>
GetDataAfterApplyingLimits(const std::vector<std::vector<double>>& input,
                           double min_value, double max_value)
{
    std::vector<std::vector<double>> output;
    output.reserve(input.size()); // 预分配空间,减少内存分配次数

    for (const auto& row : input)
    {
        // 初始化当前行,长度和输入行一致,默认填充MISSINGVALUE
        std::vector<double> current_row(row.size(), MISSINGVALUE);
        for (size_t j = 0; j < row.size(); ++j)
        {
            if (row[j] >= min_value && row[j] <= max_value)
            {
                current_row[j] = row[j];
            }
        }
        output.push_back(std::move(current_row)); // 移动语义避免拷贝开销
    }

    return output;
}

方式二:用标准库transform简化代码

如果偏好更简洁的风格,可以结合std::transform处理行和元素:

#include <vector>
#include <algorithm>

[[nodiscard]] std::vector<std::vector<double>>
GetDataAfterApplyingLimits(const std::vector<std::vector<double>>& input,
                           double min_value, double max_value)
{
    std::vector<std::vector<double>> output;
    output.reserve(input.size());

    // 处理每一行
    std::transform(input.begin(), input.end(), std::back_inserter(output),
        [min_value, max_value](const std::vector<double>& row) {
            std::vector<double> result;
            result.reserve(row.size());
            // 处理当前行的每个元素
            std::transform(row.begin(), row.end(), std::back_inserter(result),
                [min_value, max_value](double val) {
                    return (val >= min_value && val <= max_value) ? val : MISSINGVALUE;
                });
            return result;
        });

    return output;
}

关键改进点

  • 不再假设所有行长度一致,逐行初始化输出的vector,完全匹配输入行的长度
  • 预分配空间(reserve)减少内存分配次数,提升性能
  • 使用移动语义(std::move)避免不必要的拷贝
  • 将min_value和max_value改为函数参数,提升函数的复用性和健壮性,避免依赖全局变量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:13:37