![](/img/trans.png)
[英]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.