在初始化时定义位集大小?

Posted

技术标签:

【中文标题】在初始化时定义位集大小?【英文标题】:Define bitset size at initialization? 【发布时间】:2011-03-09 06:17:50 【问题描述】:

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

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

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

#include <bitset>
class Test

public:
     std::bitset *myBitset;

这不会编译...

而且这样初始化也行不通:

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

【问题讨论】:

我不知道这是做什么用的,但如果它不会太大,你总是可以使用向量。如果您在不允许提升的环境中工作(即糟糕的工作),这是一个特别好的选择。 这应该是一个答案,而不是评论。 std::vector 不仅更大,而且在驱使我提出这个问题的应用程序中显着变慢(~5x)。 【参考方案1】:

Boost 有一个dynamic_bitset 可以使用。

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

【讨论】:

+1。遗憾的是,vector 具有这种专业化,而不仅仅是一个单独的类。这并没有让供应商更容易将其作为一种专业化来实现:只是看起来非常愚蠢。 是的。不幸的是,我相信委员会已经拒绝了所有反对它的提议。【参考方案2】:

使用Boost::dynamic_bitset

【讨论】:

谢谢。但我试图让我的应用程序尽可能简单。所以,我要去vector&lt;bool&gt;。否则我将不得不安装额外的库... Boost::dynamic_bitset 完全在头文件中实现。无需安装额外的库。【参考方案3】:

您应该查看 boosts dynamic_bitset。

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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;

【讨论】:

不。 exampleSize 必须在编译时知道。

以上是关于在初始化时定义位集大小?的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 2166. 设计位集

用不同大小的位集替换所有内部位集

2022-04-24:位集 Bitset 是一种能以紧凑形式存储位的数据结构。 请你实现 Bitset 类。 Bitset(int size) 用 size 个位初始化 Bitset ,所有位都是 0

在 C++ 中定义一个大的位集

生成大小为 1 到 n 的所有组合(位集)

C 语言数组 ( 数组本质 | 数组长度定义 | 数组初始化 | 编译时初始化 | 显式初始化 - 重置内存 )