[英]How to avoid calling memcpy() when appending to vector<array<char,N>>?
[英]how can I memcpy bool vector to char array?
我有两个向量。
一个是
std::vector<unsigned char> one_v;
另一个是
std::vector<bool> outputValuesInBits;
我将值同时推送到one_v和outputValuesInBits。
两个向量都有两个字节。
one_v [0]和[1]填充了2个字节的数据。
outputValuesInBits [0]至[15]填充了2个字节的数据。
现在,我想将数据(memcpy)复制到char数组。
我可以成功地从one_v向量复制数据,如下所示。
unsigned char* output = new unsigned char[one_v.size()]();
memcpy(&output, one_v.data(), 2);
但是我无法从outputValuesInBits复制数据。
如果我照做,
unsigned char* output = new unsigned char[outputValuesInBits.size()/8+1]();
memcpy(&output, outputValuesInBits.data(), 2);
它给我一个错误
error: invalid use of void expression
memcpy(&output, outputValuesInBits.data(), 2);
谁能告诉我如何将布尔向量复制到char数组?
先感谢您!
std::vector<bool>
没有数据成员函数
恐怕您不能随身携带。 vector上的Cplusplus页上说: 该专业化与非专业化vector具有相同的成员函数,但本专业化中不存在的数据,emplace和emplace_back除外。 这意味着在尝试使用data
,未定义的data
会解释错误。
如果不选择可移植性,将没有解决方案,因为存储不一定是布尔值数组,但是库实现可以优化存储,以便将每个值存储在单个位中。 (强调我的)。 我对may的理解是,您甚至无法确定将16个布尔值存储在2个连续的字节中:该实现只能(几乎)为您提供一种使用它们的方式,就好像它们存储在16个不同的布尔值中一样。
如果您忘记了可分区性,则必须找到当前实现的源,以了解字节数组的存储位置和存储方式……但这并不那么容易……
至少在g ++编译器中,可以使用vector :: iterator的_M_p成员,该成员是指向数据的指针。
例:
std::vector<bool> vBool(16, false);
vBool[0] = true;
vBool[2] = true;
vBool[13] = true;
std::vector<unsigned char> vChar(2);
unsigned short *ptrUS = reinterpret_cast<unsigned short *>( &(vChar[0]) );
*ptrUS = *reinterpret_cast<unsigned short *>(vBool.begin()._M_p);
std::cout << (unsigned int)vChar[0] << " " << (unsigned int)vChar[1] << "\n";
给出输出“ 5 32”,它对应于具有第一和第三位(5)和第六位(32)的数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.