2015-09-26 52 views
0

我有兩個向量。
一個是我怎樣才能memcpy布爾向量字符數組?

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); 

誰能告訴我如何我可以複製的布爾矢量字符數組?

預先感謝您!

+0

」存儲不一定是一個布爾值數組,但庫實現可以優化存儲,以便每個值都存儲在一個位中。「 - http://www.cplusplus.com/reference/vector/vector-bool/ - 重點是你不能依賴佈局。 – sje397

回答

1

恐怕你不能以便攜的方式。 Cplusplus page on vector說:專業化與非專業化的矢量具有相同的成員函數,但數據,emplace和emplace_back除外,這些專業化中不存在。這意味着data未定義在您嘗試使用它時解釋錯誤的原因。

如果可移植性是不是一種選擇,就沒有解決辦法,因爲存儲不一定是布爾值的陣列,但庫實現可以優化存儲,使得每個值存儲在一個單個位。(強調我的)。我對的理解可能是,您甚至不能確定16個布爾值是否存儲在2個連續的字節中:實現只能爲您提供一種方式來使用它們(幾乎),就好像它們存儲在16個不同的布爾值中一樣。

如果你可以忘記partability,你必須找到從源頭爲您當前的實現要知道在哪裏以及如何字節數組存儲...但它不是那麼容易......

+0

謝謝。然後,我可能不得不將位向量複製到位集。 'for循環'只是將數據複製到bitset的解決方案? –

+0

或者你認爲有更好的方法從bool向量複製到char *? –

2

std::vector<bool>沒有按」沒有數據成員函數

+0

呃??? http://en.cppreference.com/w/cpp/container/vector/data –

+2

檢查更好http://www.cplusplus.com/reference/vector/vector-bool/ – user5159806

+1

cppreference鏈接將是http:// en.cppreference.com/w/cpp/container/vector_bool – Cubbi

0

至少在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)中,用第6位(32)。「