0

n個のサンプルを追跡する必要があります。私が追跡している情報はブール型です。つまり、何かが真か偽かです。サンプルn+1に入るとすぐに、基本的に最も古いサンプルを無視して、最新のサンプルに関する情報を記録したいと思います。

だから私がサンプルを追跡していると言うと、私は次のようなものを持っているかもしれません

最も古い00110最新

次のサンプルが1の場合、これは次のようになります。

最も古い01101最新

次のものが0の場合、これは次のようになります...

最も古い11010最新

では、シンプルさとメモリの観点からこれを実装するための最良の方法は何ですか?

私が持っていたいくつかのアイデア:

ブール値のベクトル(これにはシフト要素が必要になるため、コストがかかるようです)ビットとして格納し、ビットシフトを使用します(メモリ的には安いですか?ただし、サンプル数に制限はありますか?)リンクリスト?(タスクにとってやり過ぎかもしれません)

アイデアと提案をありがとう:)

4

5 に答える 5

2

ビットのセットが必要です。多分あなたはstd::bitsetを調べることができます

http://www.sgi.com/tech/stl/bitset.html

非常に簡単に使用でき、最適なメモリ消費量とおそらく最高のパフォーマンス

唯一の制限は、コンパイル時にnの値を知る必要があることです。実行時に設定する場合は、boosthttp://www.boost.org/doc/libs/1_36_0/libs/dynamic_bitset/dynamic_bitset.htmlを参照してください。

于 2011-04-12T15:07:22.113 に答える
1

リングバッファの完璧な使用法のように聞こえます。残念ながら、標準ライブラリには1つありませんが、boostを使用できます。

古い要素を上書きする必要がある場合は、固定長std::listとヘッドノードを使用してテールに交互にロールします。splice

于 2011-04-12T15:07:01.293 に答える
1

それは本当にあなたが保持したいサンプルの数に依存します。 vector<bool>有効なオプションである可能性があります。erase()私は最初の要素がかなり効率的であることを期待し ます。それ以外の場合は、がありdeque<bool>ます。コンパイル時に保持したい要素の数がわかっている場合bitset<N>は、おそらくどちらよりも優れています。

いずれの場合も、標準コンテナをいくつかの追加ロジックでラップする必要があります。必要な実際のロジック(リングバッファのロジック)はありません。

于 2011-04-12T15:16:38.357 に答える
0

8ビットのみが必要な場合は、charを使用し、論理シフト "<<、>>"を実行し、マスクを実行して必要なものを確認します。

  • 16ビット-短い
  • 32ビット-int
  • 64ビット-長い
  • 等...

例:

最も古い00110010最も新しい->最も古い1001100101最も新しい

によって行われ:

char c = 0x32; // 50 decimal or 00110010 in binary
c<<1; // Logical shift left once.
c++; // Add one, sense LSB is the newest.

//Now look at the 3rd newest bit
print("The 3rd newest bit is: %d\n", (c & 0x4));

シンプルで非常に安価なリソース。非常に非常に高性能になります。

于 2011-04-12T15:07:05.683 に答える
0

あなたの質問から、あなたがサンプルで何をしようとしているのかは明確ではありません。最新のN個のサンプルを保存するだけの場合は、次のことを試してみてください。「chars」に対してそれを行い、必要に応じて「bool」を最適化する方法を理解させます。

char buffer[N];
int samples = 0;

void record_sample( char value )
{
  buffer[samples%N] = value;
  samples = samples + 1;
}

N個のサンプルを保存すると(record_sampleをN回呼び出した後)、次のように最も古いサンプルと最新のサンプルを読み取ることができます。

char oldest_sample()
{
  return buffer[samples%N];
}

char newest_sample()
{
  return buffer[(samples+N-1)%N];
}

N個のサンプルを保存する前に最も古いサンプルを読み取る場合は、少し注意が必要ですが、それほど注意は必要ありません。そのためには、ブーストやウィキペディアで見つけることができる「リングバッファ」が必要です。

于 2011-04-12T19:14:44.367 に答える