2014-03-04 46 views
-2

我有各種結構(由整型類型和整數類型數組組成)以及我想添加到無符號字符向量中的無符號字符數組。將結構添加到字節向量,然後再添加另一個

因此,考慮以下僞代碼:

struct 
{ 
short x; 
short sz; 
unsigned char y; 
unsigned char w; 
unsigned char z[ 2 ]; 
} example_struct; 

example_struct ex_s; 
unsigned char array[ <some val-could be several thousand> ]; 

我看了看這個問題:Convert a struct to vector of bytes 和我寫道:

std::vector< unsigned char > v(sizeof(example_struct) + array_len); 
unsigned char * ptr = reinterpret_cast< unsigned char * >(&ex_s); 
std::vector< unsigned char > tmp_v(ptr, ptr + sizeof(example_struct)); 
v = tmp_v; 
std::vector< unsigned char > tmp_v2(array, array + array_len); 
v.insert(v.end(), tmp_v2.begin(), tmp_v2.end()); 

是否有更簡單(更易讀)的方式做它?

用結構的內容創建v而不是將臨時變量賦值給它會更高效嗎?

如果這樣做,那麼v不會是最後長度的大小,最有可能導致在添加數組時通過向量進行另一次內存分配。會創建一個空的矢量創建,然後是總長度的備用加上添加是首選嗎?

交換是首選嗎?

是插入添加第二個向量的首選方法嗎?

關於如何寫這個的任何其他建議?

+1

這個問題對Stack Overflow來說太寬泛了,這個問題是關於編碼和確定答案的具體問題。這對於[代碼評論](http://codereview.stackexchange.com)或[程序員](http://programmers.stackexchange.com)更爲合適。請閱讀[此meta post](http://meta.stackexchange.com/a/82990/228805)瞭解更多信息。 –

回答

0

你並不需要創建一個臨時vector,你可以只使用insert(),如:

vector<unsigned char> v; 
unsigned char *ptr = (unsigned char *)&ex_s; 
v.insert(v.end(), ptr, ptr + sizeof(example_struct)); 
v.insert(v.end(), array, array + array_len); 

注意,你也不需要(或者,在我的例子中,希望)爲矢量賦予初始大小。但是,您可能希望保留能力提前(一個簡單的,如果有時過早,優化):

v.reserve(sizeof(example_struct) + array_len); // <- prior to inserts 

而且,請注意,結構成員的填充可能會導致其代表性的載體不你期望什麼;或者至少在編譯器中不一致。您將需要使用1個字節的包裝;編譯器特定選項(例如#pragma pack for MSVC__attribute__((packed)) for GCC)。否則,你可能會在結構成員之間產生垃圾填充字節。

一個真正便攜式的做法是在同一時間插入每個成員,按價值計算,一個,並使用在short小號位操作執行字節順序,而不是相反轉換指針或做字節副本。

+0

但當然!這很有道理。謝謝。 – Grasshopper

+0

@Grasshopper順便說一下,在這種特殊情況下,你並不需要使用'reinterpret_cast',但它*非常清楚地表明你的意圖,所以,不要把我的代碼片段作爲一個案例。 –

相關問題