在初始化时定义位集大小?
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>();
【问题讨论】:
我不知道这是做什么用的,但如果它不会太大,你总是可以使用向量Boost 有一个dynamic_bitset
可以使用。
或者,您可以使用vector<bool>
,(不幸的是)专门用作位集。这会引起很多混乱,通常被认为是一个坏主意。但这就是它的工作原理,所以如果这是你需要的,你不妨使用它,我想。
【讨论】:
+1。遗憾的是,vector 具有这种专业化,而不仅仅是一个单独的类。这并没有让供应商更容易将其作为一种专业化来实现:只是看起来非常愚蠢。 是的。不幸的是,我相信委员会已经拒绝了所有反对它的提议。【参考方案2】:使用Boost::dynamic_bitset
【讨论】:
谢谢。但我试图让我的应用程序尽可能简单。所以,我要去vector<bool>
。否则我将不得不安装额外的库...
Boost::dynamic_bitset 完全在头文件中实现。无需安装额外的库。【参考方案3】:
您应该查看 boosts dynamic_bitset。
【讨论】:
【参考方案4】:你一开始说的不是真的。 “您找到的示例”看起来不像您发布的那样。使用非常量值来参数化模板是不可能的。所以,你的第一个例子是无效的。只有常量表达式可以用作模板的非类型参数。 IE。非类型参数必须是编译时常量。
Of 看起来您想创建一个大小不是编译时常量的位集。在这种情况下,bitset
模板是没有问题的。您需要一个运行时大小的位集的实现。例如,您可以使用std::vector<bool>
- 在许多(如果不是全部)实现中,此模板专门用于实现 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
必须在编译时知道。以上是关于在初始化时定义位集大小?的主要内容,如果未能解决你的问题,请参考以下文章
2022-04-24:位集 Bitset 是一种能以紧凑形式存储位的数据结构。 请你实现 Bitset 类。 Bitset(int size) 用 size 个位初始化 Bitset ,所有位都是 0