二维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
相关产品推荐
相关产品推荐

