これは私が選択したmax_size
の下に私のベクトルの長さを保つために働き、私はそれを私のテストで壊すことができませんでしたが、ベクトルサイズを安全に制限する方法ですか?最大サイズのベクトルを保持していますか?
if (vector.size() >= max_size) {
vector.erase(vector.begin());
}
私はメモリにのみ状態の有限数を維持したいので、元に戻すには/状態をやり直すことがあります。
これは私が選択したmax_size
の下に私のベクトルの長さを保つために働き、私はそれを私のテストで壊すことができませんでしたが、ベクトルサイズを安全に制限する方法ですか?最大サイズのベクトルを保持していますか?
if (vector.size() >= max_size) {
vector.erase(vector.begin());
}
私はメモリにのみ状態の有限数を維持したいので、元に戻すには/状態をやり直すことがあります。
このアプローチは、(一度に要素を追加してくださいと仮定)動作しますが、非常に高速であることを行っていません。 std::vector
タイプは、最初の部分ではなく最後の挿入と削除に最適化されており、std::vector
に多数の要素がある場合、最初の要素を削除するコストが高くなります。大きなバッファを保持している場合は、先頭と末尾の削除に最適化されたstd::deque
(正確には使用例)を使用する方がよい場合があります。
価値があるのは、あなたが論理的に話しているデータ構造の一種である「循環バッファ」という用語です。
std::vector
がmax_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);
}
これは、ベクターに追加する唯一の方法の最初の部分です。そのため、私はその問題に取り組むつもりはないと思いますが、将来のベクターの使用に考慮します。 – Kebtiz
スレッドが1つしかない限り、一度に複数のアイテムを追加することは不可能であり、反復中には実行しません。オフトピック:代わりに['std :: deque'を使用することを検討してください](http://en.cppreference.com/w/cpp/container/deque)これは、この使用のためのより良いパフォーマンスが必要ですが、連続しないでしょうメモリ。 – user4581301
[boost :: circular_buffer](http://www.boost.org/doc/libs/1_62_0/doc/html/circular_buffer.html)を参照してください。既に指摘しているように、あなたが気付いていないにもかかわらず、あなたが描写しているのは、*リング*または*循環バッファ*です。 – PaulMcKenzie
さて、これらのオプションを調べていただきありがとうございます。それは合理的に小さなセット、50 8バイトのタイプであり、ユーザのクリック入力の最大速度でアクセスされますが、できる限り最適化することはおそらく良い習慣です。 – Kebtiz