我想在C ++中做一个bitset。我做了一些研究。我发现的所有例子都是这样的:
bitset<6> myBitset;
// do something with it
但是当我在我的类中定义变量时,我不知道bitset的大小:
#include <bitset>
class Test
{
public:
std::bitset *myBitset;
}
这不会编译......
像这样初始化也不起作用:
int size = getDependentSizeForBitset();
myBitset = new bitset<size>();
答案 0 :(得分:22)
Boost有dynamic_bitset
你可以使用。
或者,您可以使用vector<bool>
,其中(不幸的是)专门用作bitset。这会引起很多混乱,一般来说被认为是个坏主意。但这就是它的工作方式,所以如果这就是你所需要的,你可能也会使用它,我想。
答案 1 :(得分:6)
答案 2 :(得分:1)
你应该看一下boosts dynamic_bitset。
答案 3 :(得分:1)
你在开头说的不是真的。您发现的“示例”看起来并不像您发布的那样。使用非常量值来参数化模板是不可能的。所以,你的第一个例子是无效的。只有常量表达式可以作为模板的非类型参数。即非类型参数必须是编译时常量。
看起来你想要创建一个大小不是编译时常量的bitset。在这种情况下,bitset
模板是不可能的。您需要实现运行时大小的bitset。例如,您可以使用std::vector<bool>
- 在许多(如果不是全部)实现中,此模板专门用于实现布尔值的压缩数组,其中每个元素占用一位(相对于一个bool
对象)。
答案 4 :(得分:0)
bitset需要size作为模板参数,这意味着必须能够在编译时确定大小。它不能基于运行时条件,如用户输入。
为此,您应该查看std :: vector或boost :: dynamic_bitset。 std :: vector是一个专用的模板实例,每个元素使用一位。与bitset不同,它可以动态调整大小。
答案 5 :(得分:-2)
您可以将您的班级设为模板,以使std::bitset
的大小不确定,直到实例化您的班级为止。您可以这样做:
#include <bitset>
template<int size>
class Test
{
public:
std::bitset<size> bitset;
//...
}
然后使用您的课程,您将必须执行以下操作:
int exampleSize = 42;
Test<exampleSize> name;