我想增加 std::vector<size_t>
中的每个元素长度256
一个,但取决于 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;
}
最佳答案
由于 bitset
没有迭代器,我们不能简单地使用 std::transform
。但是我们可以围绕 size_t
创建类似迭代器的包装器,并像索引一样使用它:
#include <iostream>
#include <bitset>
#include <vector>
#include <iterator>
#include <algorithm>
#define SIZE 3
class IntegralIterator
{
public:
IntegralIterator(size_t v = 0) : value(v) {}
size_t operator*()
{
return value;
}
IntegralIterator& operator++()
{
++value;
return *this;
}
private:
size_t value;
};
int main() {
size_t size=SIZE;
std::vector<size_t> v(SIZE); v={3,0,7};
std::bitset<SIZE> b("110");
std::transform(v.begin(), v.end(), IntegralIterator(), v.begin(),
[&](size_t s, size_t index)
{
return s + b[size-1-index];
});
std::copy(v.begin(), v.end(),
std::ostream_iterator<size_t>(std::cout, ",") );
return 0;
}
关于c++ - 根据 std::bitset<N> 增加 std::vector<T> 内的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38245614/