将矢量<bool>转换为整数

convert vector<bool> to int

本文关键字:转换 整数 gt bool lt      更新时间:2023-10-16

我有一个boolvector,我想复制到一个更大尺寸的int容器中。有什么快速的方法吗?

澄清一下,是否有更聪明的方法来实现这一点?

#include <vector>
#include <cstdint>
#include <iostream>
#include <climits>
#include <cassert>

inline size_t bool2size_t(std::vector<bool> in) {
    assert(sizeof(size_t)*CHAR_BIT >= in.size());
    size_t out(0);
    for (size_t vecPos = 0; vecPos < in.size(); vecPos++) {
        if (in[vecPos]) {
            out += 1 << vecPos;
        }
    }
    return out;
} 
int main () {
    std::vector<bool> A(10,0);
    A[2] = A[4] = 1;
    size_t B = bool2size_t(A);
    std::cout << (1 << 2) + (1 << 4) << std::endl;
    std::cout << B << std::endl;
}

我正在寻找类似memcpy的东西,我可以在子字节级别上使用。

下面是一个使用c++ 11的例子:

#include <vector>
#include <iostream>
#include <numeric>
using namespace std;
int main() {
    vector<bool> b(10,0);
    b[2] = b[4] = 1;
    int i;
    i = accumulate(b.rbegin(), b.rend(), 0, [](int x, int y) { return (x << 1) + y; });
    cout << i << endl;
}

另一个使用GCC内部组件的vector<bool>的更高效的解决方案:

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    vector<bool> b(10,0);
    b[2] = 1;
    b[4] = 1;
    auto p = b.begin()._M_p;
    cout << *p << endl;
}

请注意,不建议使用vector<bool>,因为它是vector<T>的一个有问题的专门化,并且具有稍微不同的API。我建议使用vector<char>,或者创建自己的Bool包装器类,与bool进行隐式转换。

实现可以按照您想要的方式将vector<bool>存储为位集,但不是必须这样做。如果可以更改类型,请查看bitset模板类,它的工作方式相同,但实现了例如to_ulong

参见这个问题。

编辑:如果Boost是OK的,有dynamic_bitset,它将为您做分块,如果您需要存储超过unsigned long可以容纳。