【发布时间】:2016-07-07 12:34:59
【问题描述】:
我想将长度为256 的std::vector<size_t> 中的每个元素增加一,但取决于std::bitset<256> 的相同位置(如果等于1)。
下面的代码可以编辑/编译here。
我的问题是,我可以摆脱for 循环并使用一些快速的逻辑运算符吗?
#include <iostream>
#include <bitset>
#include <vector>
#include <iterator>
#include <algorithm>
#define SIZE 3
int main() {
size_t size=SIZE;
std::vector<size_t> v(SIZE); v={3,0,7};
std::bitset<SIZE> b("110");
for (size_t i=0; i<size; ++i)
{
if (b[size-1-i]) // reverse
{
++v[i];
}
}
std::copy ( v.begin()
, v.end()
, std::ostream_iterator<size_t>(std::cout, ",") );
// 3+1,0+1,7+0
// => 4,1,7
return 0;
}
【问题讨论】:
-
你可以“矢量化”。一次读取 2 位,根据值生成 0 或 1 的 SSE 向量(使用表),然后通过直接访问向量缓冲区来添加它。如果您不喜欢
if,可以将if(a)b+=1替换为b+=a(因为a是0 或1)。 -
我不这么认为,如果你正在处理任意向量长度,在上面的编译器会做一个循环展开,对多个数据一个操作寄存器进行操作。
-
如果循环很烦人,您可以随时尝试
std::transform(v.begin(), v.end(), b.rbegin(), v.begin(), std::plus<size_t>()) -
@user1447257
bitset不幸的是没有定义迭代器,所以这不起作用。 -
我能想到的唯一加速(假设你要处理比大小 3 大得多的向量)是一次检查一个字节(或更多),并有快捷方式字节全为零或全一。不幸的是,对于这个想法,
std::bitset似乎不会一次公开字节,因此您必须使用其他东西。也许std::array?
标签: c++ stdvector binary-data std-bitset