给定一个块大小N和一个长度k*N的整数向量,它可以看作k个N整数块,我想创建一个长度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这样容易出错的算术运算
演示