両端キューがメモリをまばらに割り当てることは、標準で許可されていますか?
私の理解では、 deque のほとんどの実装は、メモリを内部的にいくつかのサイズのブロックに割り当てます。事実はわかりませんが、実装は少なくとも現在のサイズのすべてのアイテムを格納するのに十分なブロックを割り当てると思います。したがって、ブロックが 100 アイテムの場合、
std::deque<int> foo;
foo.resize( 1010 );
少なくとも 11 ブロックが割り当てられます。ただし、上記のすべての 1010 int がデフォルトで構築されていることを考えると、サイズ変更の呼び出し時にブロックを割り当てる必要がありますか? 代わりに、誰かが実際に何らかの方法でアイテムを挿入したときにのみ、特定のブロックを割り当てることができますか? たとえば、実装はブロックを「すべてデフォルトで構築された」としてマークし、誰かがそれを使用するまで割り当てない可能性があります。
最終的にどの要素を使用するかという点で非常にまばらな、非常に大きなサイズの両端キューが必要になる可能性がある状況があるので、質問します。もちろん、マップのような他のデータ構造を使用することもできますが、deque のルールに興味があります。
サイズ変更の署名を考えると、関連する質問void resize ( size_type sz, T c = T() );
は、標準で既定のコンストラクターが正確にsz
何度も呼び出されることを要求するかどうかです。答えが「はい」の場合、少なくとも int や double などの組み込み型では可能かもしれませんが、少なくとも自明ではないデフォルト コンストラクターを持つ型に対してはスパース割り当てを行うことはできないと思います。