[英]Setting boost dynamic_bitset from a string
我有一個用例需要填充
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.