动态位集

我有其中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团队博客已覆盖右值和移动语义的很好此处

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top