初始化时定义位集大小?

39

我想在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>();

3
我不确定这是用来做什么的,但如果它不太大,你可以使用vector<bool>。特别是在不能使用boost(例如糟糕的工作环境)时,这是一个很好的选择。 - Cam
2
那应该是一个答案,而不是评论。 - graham.reeds
3
std::vector<bool> 不仅更大,而且在驱动我提出这个问题的应用程序中明显较慢(约为5倍)。 - sdenham
7个回答

31

Boost提供了一个dynamic_bitset,可以使用。

另外,您还可以使用vector<bool>,它被特化为作为位集合。这引起了很多混淆,并且通常被认为是一个不好的主意。但这就是它的工作方式,所以如果这正是您需要的,那么您可能也可以使用它。


5
很遗憾,向量具有这种特殊性而不是完全分离的类。它似乎并没有使供应商更容易实现它,这似乎非常愚蠢。 - stinky472
是的。不幸的是,我相信委员会已经抵制了所有废弃它的提议。 - jalf

8

1
谢谢。但我想尽可能将我的应用程序保持简单,所以我选择使用 vector<bool>。否则,我就必须安装额外的库... - Martijn Courteaux
1
Boost::dynamic_bitset 完全由头文件实现。不需要额外安装库。 - Thomas Jones-Low

1
你应该了解一下 Boost 库里的 dynamic_bitset。

0

如果你正在解决一个编程问题,那么有一个可能的想法是:

  1. 根据给定的限制条件定义具有最大可能大小的位集。

  2. 定义一个值为 ((1 << k) - 1) 的位集 "mask",其中 'k' 是所需的大小。

  3. 不要直接使用位集进行计算,而是使用 (bitsetName & mask)

// Suppose the maximum size of bitset according to given constraints is 20
#define bst20 bitset<20>

// Define bitset with value ((1 << k) - 1)
bst20 mask((1 << k) - 1);

// Before computation use '&' operator with mask

// Some examples
map.insert(bitsetName & mask);
print(bitsetName & mask);

0

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

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


0

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

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


-6

你可以将你的类定义为模板,这样就可以使得 std::bitset 的大小在实例化之前不确定。你可以像这样实现:

#include <bitset>

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

然后要使用你的类,你需要这样做:

int exampleSize = 42;
Test<exampleSize> name;

3
不行。'exampleSize' 必须在编译时已知。 - wcochran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接