0

特定のタイプのオブジェクトがたくさんあり、それぞれが同じタイプの他のオブジェクトを保持するために両端キューを割り当てる場合があります。両端で高速アクセスが必要であり、特定のオブジェクトが他の多くのオブジェクトを参照する可能性があるため、両端キューを使用しています。

ただし、オブジェクトの多くまたはほとんどが他のオブジェクトをほとんど参照していない場合があります。この場合、dequeのメモリ使用量はかなり大きくなります。私が使用している実装は、最初のpush_back()を実行するとすぐに、一度に4096バイトを割り当てます。dequeの各要素はわずか8バイトです。これは、特に私がこれらのオブジェクトの多くを作成しているため、したがってこれらの両端キューの多くを作成しているため、非常に多くの無駄なスペースです。

同時に、ほとんどのオブジェクトが他のオブジェクトをほとんど参照していないにもかかわらず、特定のオブジェクトは実際には他の多くのオブジェクトを参照できるため、deque(またはそのようなもの)が必要です。

私の最初の考えは、capacity()とreserve()を使用してdequeを自分で拡張することでしたが、コンパイラーから、dequeにはそのような関数がないことが通知されました。

したがって、おそらく、16個の要素が存在するまでベクトルが使用され、その後、ベクトルが破棄されて両端キューが使用される、ベクトルと両端キューの基礎となる両端キューのようなインターフェイスを持つクラスを作成することを考えていました。そこから。

ベクトルは要素の数が少ない場合にのみ使用されるため、push_front()とpop_front()が速度の点で非効率になることはそれほど重要ではありません。また、ベクトルを次のように制御できるためです。 capacity()とreserve()の場合、より多くの要素が存在するときにdequeが大量のメモリを使用することはそれほど重要ではありません。

しかし、このように自分のクラスをロールする前に、このようなものがすでに存在するかどうかを確認したかったのです。また、このようなことが悪い考えである理由を誰かが知っている場合、または誰かが関連する提案を持っている場合は、それを聞いてみたいです。

前もって感謝します。

4

2 に答える 2

2

ランダムアクセスイテレータの他の機能が必要vectorかどうかについては言及しません。dequeそうでない場合、これは実際に使用するのに適した候補のように聞こえますlist。両端からの出し入れに優れています。

于 2011-01-14T17:48:02.927 に答える
2

インデックスによるランダムアクセスが必要ない場合は、(侵入型)リストを使用できます。リストを使用すると、O(1)push_front/push_back()とをすばやく使用できpop_front/pop_back()ます。

オブジェクトが共有されていない場合、つまり、オブジェクトが所有されているのは最大で1つの他のオブジェクトのみである場合は、煩わしいリストが最適です。また、オブジェクトは同じタイプであるため、メモリのオーバーヘッドを回避するために、1つのメモリプール(大きな配列)からオブジェクトを割り当てることができます。

于 2011-01-14T17:54:45.163 に答える