【问题标题】: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)。

标签: c++ bitset


【解决方案1】:

Boost 有一个dynamic_bitset 可以使用。

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

【讨论】:

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

【讨论】:

  • 谢谢。但我试图让我的应用程序尽可能简单。所以,我要去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 必须在编译时知道。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 2016-09-10
        • 1970-01-01
        • 2022-08-01
        相关资源
        最近更新 更多