17

私のプログラムでは、2.5*10^9 のセットで既に値を生成しているかどうかを確認する必要があります。セットの約半分を生成することを期待しており、それを確認して更新するための高速な方法が必要です。ビットセットは、あまり多くのメモリを必要とせず (値ごとに 1 ビット)、高速であるため、私には良いアイデアのように思えました。

問題は、自分のクラスで自分のセットを定義するsegmentation faultと、サイズが大きすぎる (小さいサイズで動作する) ということです。

private:
  std::bitset<2500000000UL> cover; // not working
  std::bitset<25000UL> cover; // working

何か案が ?

ありがとうございました

PS: 可能であれば、外部ライブラリを使用したくありません。私はすでにGMPを使用していますが、大きな数に対して少し設定された実装があるとは思いません。

4

4 に答える 4

23

これは問題ではないかもしれませんが、スタックを使用する代わりに、ヒープにビットセットをnewで割り当ててみてください。

一部のシステムでは、スタックのサイズが制限されているため、問題が発生する可能性があります。

于 2011-04-25T15:47:28.190 に答える
0

ここでのメモリはヒープではなくスタックに割り当てられているため、セグメンテーション違反が発生します。スタック上のメモリ割り当ては非常に制限されているため、そうすることができません。これは、動的メモリ割り当てが助けになるときです。malloc がどのように機能するかを知っている場合は、次のようにコードを変更できます。

bitset<1000000000> *b;
b = (bitset<1000000000> *)malloc(sizeof(bitset<1000000000>));
b->set(0,1);

ビットセットの操作が完了したら、delete キーワードを使用して削除します。

于 2021-04-03T18:56:48.157 に答える
-1

サイズが大きい場合は、std::bitset の代わりに std::vector を使用します。

于 2015-09-28T20:53:43.507 に答える