0

我想将 a 中的每个元素的std::vector<size_t>长度256增加一,但取决于 a 的相同位置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;
}
4

1 回答 1

1

由于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;
}
于 2016-07-07T13:09:03.943 回答