求和的整数邻接块的C++算法

给定一个块大小N和一个长度k*N的整数向量,它可以看作kN整数块,我想创建一个长度k的新向量,其元素是原始向量块的和

例如,块大小2,向量{1,2,3,4,5,6}将给出{3,7,11}的结果

例如,块大小3,向量{0,0,0,1,1,1}将给出{0,3}的结果

一种简单有效的方法:

std::vector<int>求和块(整数块大小,常数标准::向量<整数>&输入){
std::vector<int>ret(input.size()/block_size,0);
对于(无符号整数i=0;i<ret.size();++i)
{
用于(无符号整数j=0;j<块大小++j)
ret[i]+=输入[block_size*i+j];
}
返回ret;
}

然而,我很想知道是否有一种更整洁或更有效的方法,可能是使用算法

如果可以使用range-v3库,则可以编写如下函数:

名称空间rv=ranges::views;
名称空间rs=范围;
自动求和块(整型块大小,标准::向量<整型>常数&输入)
{
返回输入
|rv::块(块大小)
|rv::转换([](自动常量和块){
返回rs::累加(块,0);
}) 
|rs::to<std::vector<int>;
}

这是非常不言自明的,并且避免了像block_size*i+j这样容易出错的算术运算

演示

发表评论