c++ - 根据 std::bitset<N> 增加 std::vector<T> 内的元素

标签 c++ stdvector binary-data std-bitset

我想增加 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/

相关文章:

c++ - 了解 DirectX11 和 Directx11.1 示例 msdn 代码

c++ - 来自 vector C++ 中字节表示的 Int

c++ - 为什么 get_allocator 返回拷贝而不是引用

c++ - 如何摆脱结构的数据成员之间的填充字节

file - 如何在 R 中创建数据加载进度条?

c++ - C++程序如何分配内存

python - char* 的参数转换为 python 以通过 boost.python 在 C++ 中调用 python 函数

c++ - 取消映射缓冲区 glBindBuffer() 时出现段错误

c++ - 是否可以返回对 std::vector 中数据的引用,并在 vector 超出范围后保留该引用?

c - C 中的链表和二进制数据