C++ 从字符串设置boost dynamic_位集

C++ 从字符串设置boost dynamic_位集,c++,boost,bitsets,C++,Boost,Bitsets,我有一个需要填充的用例 boost::dynamic_bitset<unsigned char> , from a std::string buffer. boost::dynamic\u位集,来自std::string缓冲区。 你能建议一下怎么做吗。所以我需要想出一个函数 void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> &a

我有一个需要填充的用例

boost::dynamic_bitset<unsigned char> , from a std::string buffer.
boost::dynamic\u位集,来自std::string缓冲区。
你能建议一下怎么做吗。所以我需要想出一个函数

void populateBitSet (std::string &buffer, 
            boost::dynamic_bitset<unsigned char> & bitMap) {

     //populate bitMap from a string buffer
}
void populateBitSet(标准::字符串和缓冲区,
boost::动态(位集和位图){
//从字符串缓冲区填充位图
}

如果您有如下二进制数据:

string buffer = "0101001111011";
您希望像这样初始化它(结果是有一个可以处理这种情况的程序):

void populateBitSet(std::string&buffer,boost::dynamic_位集&位图)
{        
位图=boost::动态_位集(缓冲区);
}
如果需要原始数据,请使用:

void populateBitSet(std::string&buffer,boost::dynamic_位集&位图)
{        
位图=boost::动态_位集(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);
}
//在C++0x中是不必要的
void populateBitSet(std::string&buffer,boost::dynamic_位集&位图)
{        
boost::dynamic_bitset localBitmap(buffer.begin(),buffer.end());
交换(本地位图);
}
编辑: 要澄清为什么第一个版本会分配两倍的内存:

看看编写第一个版本的另一种方法:

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
}
typedef boost::动态_位集位;//只是为了缩短示例。
void populateBitSet(标准::字符串和缓冲区、位和位图)
{        
常量位&temp=位(缓冲区);//1.初始化临时
bitMap=temp;//2.将数据从temp复制到位图
}
如果将这两行放在一起(如第一个示例所示),仍然会在堆栈上构造一个临时值,然后是赋值。在1。boost需要为整个比特集分配足够的内存。在第二种情况下,boost需要再次分配足够的内存来保存同一组位,然后复制这些值。位图可能已经有足够的内存,所以它可能并不总是需要重新分配,但也可能会释放其备份内存并从头开始重新分配

大多数适合stl模具的容器还具有交换功能,当您打算丢弃交换的一侧时,可以使用该功能代替分配。这些通常是O(1)和非抛出,因为它们通常只涉及交换一些指针。看到这一点还有另一个原因,为什么这些是有用的


在C++0X中,您可以使用赋值,但仍然可以获得交换的优点。因为您可以重载r值(比如临时值),所以容器知道当您分配临时值时,它知道它可以分解临时值并基本上进行交换。Visual Studio团队博客已经介绍了右值和移动语义。

您至少需要指定字符串的解释方式。是否仅为字符“1”和“0”,而这些是位?还是十六进制表示法?还是希望字符串的原始存储进入位集中?字符串缓冲区是否充满二进制数据或字符串数据?也就是说,它是这样初始化的:string buffer=“11111 01001010000”;,或者这个字符串缓冲区={0xfa,0x50};什么是相同的字符串缓冲区?它是“01010111”或“asdfvfdsa”?我的字符串缓冲区是一个包含01的缓冲区,即string buffer=“01010111”;嘿,乔希,我不明白你说的非交换版本分配了两次。。。你能解释一下吗?谢谢
// 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
}