如果你有这样的二进制数据:
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 中,您将能够使用赋值,并且仍然获得交换的优势。由于您可以重载 r 值(例如临时值),因此容器知道当您分配临时值时,它知道它可以蚕食临时值并基本上进行交换。Visual Studio 团队博客在这里很好地介绍了右值和移动语义。