gpt4 book ai didi

c++ - 从字符串设置 boost dynamic_bitset

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:24 25 4
gpt4 key购买 nike

Dynamic bitset

我有一个需要填充的用例

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";

您想像这样初始化它(原来有一个 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 中,您将能够使用赋值,并且仍然可以获得交换的优势。由于您可以重载 r 值(如临时值),容器知道当您分配一个临时值时,它知道它可以蚕食临时值并基本上进行交换。 Visual Studio 团队博客涵盖了右值和移动语义 quite well here .

关于c++ - 从字符串设置 boost dynamic_bitset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/698859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com