我有一个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级别上使用。
答案 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
可以保留的内容,则会为您进行分块。