题
我有其中i需要填充一个用例
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升压需要为整组比特分配足够的内存。 2,升压需要再次分配足够的内存来保存同一组位,然后复制值了。这有可能是位图已经有足够的内存,因此它可能并不总是需要重新分配,但它也有可能是它会释放它的后盾内存反正从头重新分配。
这是适应STL模具大部分容器也有,你可以在地方分配的,当你打算扔掉交换的一侧使用交换功能。这些通常是O(1)和非投掷,因为他们往往只是涉及将一些指点。看到这个 GotW 的另一个原因是,为什么这些都是有用的。
C ++ 0x中,你就可以使用分配,并仍然得到交换的优点。既然你可以在R值(如临时)超载,容器知道,当你分配一个临时的,它知道它可以吃人肉的温度,基本上做一个交换。在Visual Studio团队博客已覆盖右值和移动语义的很好此处。
不隶属于 StackOverflow