如何将嵌套for循环转换为使用std::algorithm的现代C++实现?
用std::transform重构嵌套循环的现代C++实现
没问题,我来帮你把这段嵌套循环改成更符合现代C++风格的实现!其实用std::transform处理嵌套场景的关键是分层应用算法——外层遍历每个坐标,内层遍历每个角度生成对应计算值,咱们一步步来:
首先先看你的原代码:
std::vector<std::vector<double>> r(coordinates.size(), std::vector<double>(angles.size())); for (size_t i = 0; i < coordinates.size(); i++) for (size_t j = 0; j < angles.size(); j++) r[i][j] = coordinates[i].x * std::cos(angles[j]) + coordinates[i].y * std::sin(angles[j]);
方案1:兼容C++11及以上的std::transform嵌套实现
我们可以用两层std::transform来替代嵌套循环:外层负责把每个坐标转换成对应的结果行,内层负责把每个角度转换成该行的计算值。同时提前调用reserve()来避免不必要的内存分配,提升性能:
// 先定义一个复用的计算逻辑lambda auto calculate_value = [](const auto& coord, double angle) { return coord.x * std::cos(angle) + coord.y * std::sin(angle); }; std::vector<std::vector<double>> r; r.reserve(coordinates.size()); // 预分配外层vector的空间 // 外层transform:遍历每个坐标,生成对应的结果行 std::transform(coordinates.begin(), coordinates.end(), std::back_inserter(r), [&calculate_value, &angles](const auto& coord) { std::vector<double> row; row.reserve(angles.size()); // 预分配行内空间 // 内层transform:遍历每个角度,计算当前坐标对应的所有值 std::transform(angles.begin(), angles.end(), std::back_inserter(row), [&calculate_value, &coord](double angle) { return calculate_value(coord, angle); }); return row; });
这样写的好处是:
- 用标准算法代替手动索引循环,避免了越界风险
- 代码意图更清晰:一眼就能看出是“把每个坐标转换成一行结果,每行结果是角度的转换值”
- 保持了C++11的兼容性,大部分项目都能直接用
方案2:C++20+的Range库简化写法
如果你的项目已经支持C++20,那么用Range库的std::views::transform会更简洁,不需要手动管理reserve和back_inserter:
#include <ranges> auto r = coordinates | std::views::transform([&angles](const auto& coord) { return angles | std::views::transform([&coord](double angle) { return coord.x * std::cos(angle) + coord.y * std::sin(angle); }) | std::ranges::to<std::vector<double>>(); }) | std::ranges::to<std::vector<std::vector<double>>>();
这种写法完全抛弃了手动循环,用链式调用的方式表达转换逻辑,代码更紧凑易读,是现代C++的推荐写法。
内容的提问来源于stack exchange,提问作者bleuj
相关产品推荐
相关产品推荐

