32

我想用 C++ 做一个 bitset。我做了一些研究。我发现的所有示例都是这样的:

bitset<6> myBitset;
// do something with it

但是当我在我的类中定义变量时,我不知道位集的大小:

#include <bitset>
class Test
{
public:
     std::bitset *myBitset;
}

这不会编译...

像这样初始化也不起作用:

int size = getDependentSizeForBitset();
myBitset = new bitset<size>();
4

6 回答 6

28

Boost有一个dynamic_bitset你可以使用的。

或者,您可以使用 a vector<bool>,它(不幸的是)专门用作位集。这会引起很多混乱,通常被认为是一个坏主意。但这就是它的工作原理,所以如果这是你需要的,你不妨使用它,我想。

于 2010-06-28T17:40:53.523 回答
7

使用Boost::dynamic_bitset

于 2010-06-28T17:39:30.850 回答
1

您应该查看 boosts dynamic_bitset。

于 2010-06-28T17:40:23.180 回答
1

你一开始说的不是真的。“您找到的示例”看起来不像您发布的那样。使用非常量值来参数化模板是不可能的。所以,你的第一个例子是无效的。只有常量表达式可以用作模板的非类型参数。即非类型参数必须是编译时常量。

看起来您想创建一个大小不是编译时常量的位集。在这种情况下,bitset模板是没有问题的。您需要一个运行时大小的位集的实现。例如,您可以使用std::vector<bool>- 在许多(如果不是全部)实现中,此模板专门用于实现一个打包的布尔值数组,其中每个元素占用一位(而不是一个bool对象)。

于 2010-06-28T17:40:25.747 回答
0

bitset 需要大小作为模板参数,这意味着大小必须能够在编译时确定。它不能基于运行时条件,例如用户输入。

为此,您应该查看 std::vector 或 boost::dynamic_bitset。std::vector 是一个专门的模板实例化,每个元素使用一个位。与 bitset 不同,它可以动态调整大小。

于 2010-06-28T17:43:45.843 回答
-5

您可以使您的类成为模板,以使std::bitset大小不确定,直到您的类被实例化。你可以这样做:

#include <bitset>

template<int size>
class Test
{
public: 
    std::bitset<size> bitset;
    //...
}

然后要使用您的课程,您必须这样做:

int exampleSize = 42;
Test<exampleSize> name;
于 2019-01-04T16:31:19.060 回答