我有一个用例需要填充
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
}
答案 0 :(得分:9)
如果你有这样的二进制数据:
string buffer = "0101001111011";
你想像这样初始化它(原来有constructor处理这种情况):
void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap)
{
bitMap = boost::dynamic_bitset<unsigned char> (buffer);
}
如果您需要原始数据,请使用iterator constructor:
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并移动了语义quite well here。