web-dev-qa-db-ja.com

初期化時にビットセットサイズを定義しますか?

C++でビットセットを作りたいです。少し調べてみました。私が見つけたすべての例は次のようになります:

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

しかし、クラスで変数を定義するとき、ビットセットのサイズがわかりません。

#include <bitset>
class Test
{
public:
     std::bitset *myBitset;
}

これはコンパイルされません...

そして、このように初期化することも機能しません:

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

Boostには dynamic_bitset があります。

または、vector<bool>を使用することもできます。これは、(残念ながら)ビットセットとして機能するように特化されています。これは多くの混乱を引き起こし、一般的に悪い考えと考えられています。しかし、それがどのように機能するかなので、それが必要な場合は、それを使用した方がよいと思います。

25
jalf
7

ブーストdynamic_bitsetをチェックする必要があります。

1
graham.reeds

あなたが最初に言っていることは真実ではありません。 「あなたが見つけた例」はあなたが投稿したようには見えませんでした。一定でない値を使用してテンプレートをパラメーター化することはできません。したがって、最初の例は無効です。テンプレートの非型引数として使用できるのは、定数式のみです。つまり非型引数はコンパイル時定数でなければなりません。

サイズがコンパイル時定数ではないビットセットを作成したいようです。この場合、bitsetテンプレートは問題外です。ランタイムサイズのビットセットの実装が必要です。たとえば、std::vector<bool>を使用できます-多くの(すべてではないにしても)実装では、このテンプレートはブール値のpacked配列を実装するために特化されており、各要素は(ではなく)1ビットを占めますboolオブジェクト)。

1
AnT

ビットセットには、テンプレートパラメータとしてサイズが必要です。つまり、サイズはコンパイル時に決定できる必要があります。ユーザー入力などの実行時条件に基づくことはできません。

そのためには、std :: vectorまたはboost :: dynamic_bitsetを調べる必要があります。 std :: vectorは、要素ごとに1ビットを使用する特殊なテンプレートのインスタンス化です。ビットセットとは異なり、動的にサイズを変更できます。

0
stinky472

クラスをテンプレートにして、クラスがインスタンス化されるまでstd::bitsetサイズを未定にすることができます。あなたはこのようにそれを行うことができます:

#include <bitset>

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

次に、クラスを使用するには、次のことを行う必要があります。

int exampleSize = 42;
Test<exampleSize> name;
0
Yan B.