根据标准::<T>位集<N>增加 std::vector 中的元素

Increase elements inside std::vector<T> depending on std::bitset<N>

本文关键字:lt gt vector std 元素 增加 位集 标准      更新时间:2023-10-16

我想将长度256 std::vector<size_t>中的每个元素增加一个,但取决于std::bitset<256>的相同位置(如果等于1)。

下面的代码可以在这里编辑/编译。

我的问题是,我可以摆脱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;
}