将vector <bool>转换为int </bool>

时间:2014-07-28 11:53:17

标签: c++ memcpy

我有一个vector bool我要复制到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这样的东西,我可以在subbyte级别上使用。

2 个答案:

答案 0 :(得分:7)

以下是使用C ++ 11

的示例
#include <vector>
#include <iostream>
#include <algorithm>

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

答案 1 :(得分:4)

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

请参阅this question

修改:如果Boost没有问题,则会dynamic_bitset,如果您需要存储超过unsigned long可以保留的内容,则会为您进行分块。