2016-11-22 6 views
2

これは私が選択したmax_sizeの下に私のベクトルの長さを保つために働き、私はそれを私のテストで壊すことができませんでしたが、ベクトルサイズを安全に制限する方法ですか?最大サイズのベクトルを保持していますか?

if (vector.size() >= max_size) { 
    vector.erase(vector.begin()); 
    } 

私はメモリにのみ状態の有限数を維持したいので、元に戻すには/状態をやり直すことがあります。

+1

スレッドが1つしかない限り、一度に複数のアイテムを追加することは不可能であり、反復中には実行しません。オフトピック:代わりに['std :: deque'を使用することを検討してください](http://en.cppreference.com/w/cpp/container/deque)これは、この使用のためのより良いパフォーマンスが必要ですが、連続しないでしょうメモリ。 – user4581301

+3

[boost :: circular_buffer](http://www.boost.org/doc/libs/1_62_0/doc/html/circular_buffer.html)を参照してください。既に指摘しているように、あなたが気付いていないにもかかわらず、あなたが描写しているのは、*リング*または*循環バッファ*です。 – PaulMcKenzie

+0

さて、これらのオプションを調べていただきありがとうございます。それは合理的に小さなセット、50 8バイトのタイプであり、ユーザのクリック入力の最大速度でアクセスされますが、できる限り最適化することはおそらく良い習慣です。 – Kebtiz

答えて

2

このアプローチは、(一度に要素を追加してくださいと仮定)動作しますが、非常に高速であることを行っていません。 std::vectorタイプは、最初の部分ではなく最後の挿入と削除に最適化されており、std::vectorに多数の要素がある場合、最初の要素を削除するコストが高くなります。大きなバッファを保持している場合は、先頭と末尾の削除に最適化されたstd::deque(正確には使用例)を使用する方がよい場合があります。

価値があるのは、あなたが論理的に話しているデータ構造の一種である「循環バッファ」という用語です。

1

std::vectormax_size大きければ、あなたの方法は一つだけの要素を削除すると、あなたのメソッドが呼び出される前に、std::vectorが複数の要素によって増加されている場合、このメソッドは動作しません。

次のコードは、std::vectorにいくつの余分な要素があるかによって要素の範囲を削除します。

if (vector.size() >= max_size) 
{ 
    auto elements_to_erase = (vector.size() - max_size) + 1; 
    vector.erase(vector.begin(), vector.begin() + elements_to_erase); 
} 
+1

これは、ベクターに追加する唯一の方法の最初の部分です。そのため、私はその問題に取り組むつもりはないと思いますが、将来のベクターの使用に考慮します。 – Kebtiz

関連する問題