我有一个非常大(> 1百万元素)的std :: vector,我需要使用TCP套接字在两个进程之间发送。我使用std :: vector的原因是因为我宁愿将true和false作为单个位发送而不是占用整个字节(因为数据大小太大)。
我正在做一些小型测试用例,这样我就不会受到TCP的最大传输大小的限制,直到我知道一切正常。基本上,我正在做的是
int vec[bits->size()];
copy(bits->begin(), bits->end(), vec);
以便可以通过套接字发送它。显然,有些东西不起作用。如果vec包含1 0 1 0 1 0 1,则收到1000 0000 1000 0000 1000 0000 1000。
它明显扩展了副本中的位向量。我的问题是:如何将位向量重新解释为可以通过套接字发送的内容,同时保持原始向量的大小限制?
答案 0 :(得分:2)
即使vector<bool>
将数据存储为位,这对于通过迭代器进行访问也是透明的。因此,它按预期工作,将bool矢量复制到一个int数组中,将每个bool值转换为0或1的整数。您可以使用unsigned char *bit_ptr = reinterpret_cast<unsigned char *>(&bits[0])
但它可以逃脱它不保证。您将需要处理向量并自己生成位或使用新的数据结构。您可以考虑某种动态bitset(我相信它有一个在Boost中)或者可能vector<bitset<N>>
,使用for循环和bitset的to_ulong函数很容易转换为位数组