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

能否用std::generate直接生成std::vector<std::array<T,2>>?

当然可以一步实现!

完全没问题,你可以直接在std::generate的lambda表达式里同时计算x和y坐标,然后返回一个std::array<T,2>对象,这样就能省去中间两个std::vector<T>的创建,代码更简洁高效。

修改后的完整模板函数

#include <algorithm>
#include <array>
#include <vector>
#include <cmath> // 处理浮点数场景的floor需要

template<typename T>
std::vector<std::array<T, 2>> m(int rows, int cols) {
    std::vector<std::array<T, 2>> vec(rows * cols);
    
    std::generate(vec.begin(), vec.end(), [n = -1, cols, rows]() mutable {
        ++n;
        // 计算x值,转换为目标类型T
        T x = static_cast<T>(n % cols);
        // 计算y值:整数类型直接用整数除法(自动向下取整),浮点数可按需加floor
        T y = static_cast<T>(n / rows);
        // 浮点数场景的写法:T y = std::floor(static_cast<T>(n) / rows);
        
        return std::array<T, 2>{x, y};
    });
    
    return vec;
}

关键逻辑说明

  • lambda捕获了起始计数器n(初始为-1,每次调用先自增),以及rows和cols参数;
  • 每次迭代时,先让n自增,然后计算:
    • x坐标:n % cols,和你原来生成x序列的逻辑完全一致;
    • y坐标:如果T是整数类型,C++的整数除法会自动向下取整,和你原来用floor的效果完全相同;如果T是浮点数(比如float/double),可以把n转成T后再做除法,必要时用std::floor保证向下取整;
  • 最后直接构造std::array<T,2>并返回,std::generate会自动把这个值赋值给vec的对应元素。

示例用法

比如调用auto result = m<int>(3, 2);,生成的result序列会是:

{0,0}, {1,0}, {0,1}, {1,1}, {0,2}, {1,2}

这样就把原来的两步生成逻辑合并成了一步,既减少了内存开销,也让代码逻辑更集中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:28:10