当前位置:  开发笔记 > 编程语言 > 正文

从字符串设置boost dynamic_bitset

如何解决《从字符串设置boostdynamic_bitset》经验,为你挑选了1个好方法。

动态bitset

我有一个用例需要填充

boost::dynamic_bitset , from a std::string buffer.

你能建议如何解决这个问题.所以我需要提出一个功能

void populateBitSet (std::string &buffer, 
            boost::dynamic_bitset & bitMap) {

     //populate bitMap from a string buffer
}

Eclipse.. 9

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

string buffer = "0101001111011";

你想像这样初始化它(结果是有一个处理这种情况的构造函数):

void populateBitSet (std::string &buffer, boost::dynamic_bitset & bitMap) 
{        
   bitMap = boost::dynamic_bitset (buffer);
}

如果需要原始数据,请使用迭代器构造函数:

void populateBitSet (std::string &buffer, boost::dynamic_bitset & bitMap) 
{        
   bitMap = boost::dynamic_bitset (buffer.begin(), buffer.end());
}

这些最终会分配两次所需的内存,因此您最好使用堆栈分配和交换.或者你可以等到C++ 0x并让移动语义做他们的事情.

// Unecessary in C++0x
void populateBitSet (std::string &buffer, boost::dynamic_bitset & bitMap) 
{        
   boost::dynamic_bitset localBitmap(buffer.begin(), buffer.end());
   bitMap.swap(localBitmap);
}

编辑:澄清为什么第一个版本分配两倍的内存:

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

typedef boost::dynamic_bitset 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并在这里很好地移动了语义.



1> Eclipse..:

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

string buffer = "0101001111011";

你想像这样初始化它(结果是有一个处理这种情况的构造函数):

void populateBitSet (std::string &buffer, boost::dynamic_bitset & bitMap) 
{        
   bitMap = boost::dynamic_bitset (buffer);
}

如果需要原始数据,请使用迭代器构造函数:

void populateBitSet (std::string &buffer, boost::dynamic_bitset & bitMap) 
{        
   bitMap = boost::dynamic_bitset (buffer.begin(), buffer.end());
}

这些最终会分配两次所需的内存,因此您最好使用堆栈分配和交换.或者你可以等到C++ 0x并让移动语义做他们的事情.

// Unecessary in C++0x
void populateBitSet (std::string &buffer, boost::dynamic_bitset & bitMap) 
{        
   boost::dynamic_bitset localBitmap(buffer.begin(), buffer.end());
   bitMap.swap(localBitmap);
}

编辑:澄清为什么第一个版本分配两倍的内存:

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

typedef boost::dynamic_bitset 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并在这里很好地移动了语义.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有