7

动态位集

我有一个需要填充的用例

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
}
4

1 回答 1

10

如果你有这样的二进制数据:

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 团队博客在这里很好地介绍了右值和移动语义。

于 2009-03-30T20:32:03.320 回答