简体   繁体   English

增加std :: vector中的元素 <T> 取决于std :: bitset <N>

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

I want to increase each element in a std::vector<size_t> with length 256 by one, but depending on same position of a std::bitset<256> (if equal 1 ). 我想将长度为256std::vector<size_t>中的每个元素增加一,但要取决于std::bitset<256>相同位置(如果等于1 )。

Code below can be edited / compiled here . 下面的代码可以在这里进行编辑/编译。

My question is, can I get away from the for loop and get in some fast logical operator? 我的问题是,我可以摆脱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;
}

Since bitset doesn't have iterators we can't simply use std::transform . 由于bitset没有迭代器,因此我们不能简单地使用std::transform But we can create iterator-like wrapper around size_t and use it like index: 但是我们可以在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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM