簡體   English   中英

從字符串設置boost dynamic_bitset

[英]Setting boost dynamic_bitset from a string

動態bitset

我有一個用例需要填充

boost::dynamic_bitset<unsigned char> , from a std::string buffer.

你能建議如何解決這個問題。 所以我需要提出一個功能

void populateBitSet (std::string &buffer, 
            boost::dynamic_bitset<unsigned char> & bitMap) {

     //populate bitMap from a string buffer
}

如果您有這樣的二進制數據:

string buffer = "0101001111011";

你想像這樣初始化它(結果是有一個處理這種情況的構造函數 ):

void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap) 
{        
   bitMap = boost::dynamic_bitset<unsigned char> (buffer);
}

如果需要原始數據,請使用迭代器構造函數

void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap) 
{        
   bitMap = boost::dynamic_bitset<unsigned char> (buffer.begin(), buffer.end());
}

這些最終會分配兩次所需的內存,因此您最好使用堆棧分配和交換。 或者你可以等到C ++ 0x並讓移動語義做他們的事情。

// Unecessary in C++0x
void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap) 
{        
   boost::dynamic_bitset<unsigned char> localBitmap(buffer.begin(), buffer.end());
   bitMap.swap(localBitmap);
}

編輯:澄清為什么第一個版本分配兩倍的內存:

看看編寫第一個版本的另一種方法:

typedef boost::dynamic_bitset<unsigned char> bits; // just to shorten the examples.
void populateBitSet (std::string &buffer, bits &bitMap) 
{        
   const bits &temp = bits(buffer); // 1. initialize temporary
   bitMap = temp; // 2. Copy over data from temp to bitMap
}

如果將這兩行放在一起,如第一個示例所示,您仍然可以在堆棧上構建臨時構造,然后進行賦值。 在1. boost需要為整個位集分配足夠的內存。 在2中,boost需要再次分配足夠的內存來保存同一組位,然后復制值。 bitMap可能已經有足夠的內存,因此它可能並不總是需要重新分配,但它也可能會釋放其后備內存並從頭開始重新分配。

適合stl模具的大多數容器也有一個交換功能,當您打算丟棄交換的一側時,可以使用它來代替分配。 這些通常是O(1)和非投擲,因為它們通常只涉及交換一些指針。 請參閱此GotW ,了解其中有用的其他原因。

在C ++ 0X中,您將能夠使用賦值,並且仍然可以獲得swap的優勢。 由於你可以重載r值(比如臨時值),容器知道當你分配一個臨時值時,它知道它可以蠶食temp並基本上做一個交換。 Visual Studio團隊博客已經涵蓋了rvalues並在這里很好地移動了語義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM