私が知る限り、vector
に空き領域がなくなると、アロケータは新しい領域を作成するために使用されます。しかし、代わりに要素の下位25%を削除し、常に同じサイズを維持するカスタムのサイズ変更ポリシーを作成したいと思います。これは、限られたスペースを持つキャッシュを構築するためです。C++ Allocator:サイズ変更関数へのフック
私が望む動作を得るためにオーバーライドできるメソッドまたはデフォルトのファンクタはありますか?
私が知る限り、vector
に空き領域がなくなると、アロケータは新しい領域を作成するために使用されます。しかし、代わりに要素の下位25%を削除し、常に同じサイズを維持するカスタムのサイズ変更ポリシーを作成したいと思います。これは、限られたスペースを持つキャッシュを構築するためです。C++ Allocator:サイズ変更関数へのフック
私が望む動作を得るためにオーバーライドできるメソッドまたはデフォルトのファンクタはありますか?
TL; DR、間違ったコンテナを使用しようとしています。
アロケータは、コンテナが必要とするメモリの割り当て、割り当て解除などを担当します。必要なセマンティクスを実装するのはコンテナの責任であり、アロケータを使用してそれを支援します。
std::vector
は、おそらくあなたが記述したキャッシュ、または少なくとも未加工の形式ではないキャッシュに最適な選択ではありません。
代替手段としてブースト(circular_buffer
)を見ることができます。
vector
が指定されているとしたら、必要なキャッシュインターフェイスでラップすることもできますが、アロケータの変更は正しいルートではありません。アロケータを変更すると、コンテナの「下位」25%に有効なオブジェクトが存在し、アロケータはすでにそれら(またはそのメモリ)を削除しています。
これはアロケータの責任ではありません。 Boost.CircularBufferを試してみてください。 – milleniumbug
これらの要素のデストラクタを呼び出す必要があり、アロケータが低レベルであるため、それを実行できません。おそらく、 'std :: vector'は全く必要としません。 ['boost :: circular_buffer'](http://www.boost.org/doc/libs/1_61_0/doc/html/circular_buffer.html)を見てください。 – Quentin
http://stackoverflow.com/questions/5559730/which-stl-c-container-to-use-for-a-fixed-size-list、http://stackoverflow.com/questions/9516711/efficient-cularular -list、http://stackoverflow.com/questions/9743605/thread-safe-implementation-of-circular-buffer、http://stackoverflow.com/questions/19059336/c-threadsafe-ringbuffer-implementation –