C ++標準のリスト、およびデフォルト-構成可能なタイプ
-
22-08-2019 - |
質問
なぜstd::list<T>
の単一のパラメータのコンストラクタは、デフォルト・構成可能タイプであることをT
を必要とすることですか?私は、次のコードはコンパイルされませんを意味します。
struct Foo { // does not have default constructor.
Foo (int i) {}
}
int main(void) {
std::list<Foo> l(10);
}
他のヒント
タイプは、デフォルト構築可能になるという一般的な要件はありません - それはコピー可能と割り当て可能でなければなりません。あなたは10項目のリストを作成しようとするので、あなたのコードは動作しません - しかし、唯一、この特定のケースでは - 彼らは、デフォルトのコンストラクタが使用されなければなら何とかしてこのように構成する必要があります。あなたは空のリストを作成し、それに追加した場合は、そのような要求はないだろう。
同じことが他のコンテナのために真である - 次のコンパイルしようとします:
#include <vector>
struct A {
A( int x ) : z(x) {}
int z;
};
std::vector <A> a(10);
あなたの質問の後半部分については、私はちょうどインタフェースの一貫性を観察したい標準コンテナのための主要な設計基準ではなかった - 何の意図は、コンテナの一種で、「ドロップインであることを、例えば、ありません別のための「交換。スコットマイヤーズの本 『効果的なSTL』の項目1と2でこの良い議論があります。
ニールは既にメイン質問を答えました。
は、また、()のサイズを変更する呼び出すときにデフォルトコンストラクタが必要であることに注意します。
あなたはオブジェクトへのポインタのSTLのリストを持っていることによって、これを回避することができますが、私は、これはすでにあなたには明らかだったと思います。
関連ノートで、なぜ持っていません リスト内の容量機能?あなたはできる そのような機能が支払うことになると主張しています メモリ割り当てのコストアップフロントと あなたのように後からオーバーヘッドをなくします 一backオブジェクト。少なくともそれは意志 2つのSTLのインターフェースを作ります シーケンスコンテナもう少し 一貫しています。
私はここでの問題は、 STLリストはクロスリストスプライシング。あなたが先行メモリーを割り当てたい場合は、<のhref =「http://www.boost.org/doc/libs/1_38_0/libs/pool/doc/interfaces/pool_alloc.html」のrel = "nofollowを見てみましょうnoreferrer ">プールアロケータを後押します。
理由は、(nはあなたがコンストラクタで使用されるパラメータである)、n個の要素のリストを構築するとき、リストはT()のコピーをn個の要素の、その構造を充填することである。
なぜ、単一のパラメータということです std ::リストのコンストラクタは、Tが必要です デフォルト-構成可能タイプであることを?
このコンストラクタがあるので - (あなたは、パラメータとして渡す数)の要素を持つリストを作成します。各要素の値がデフォルトになります。また、あなたは、2つのパラメータでコンストラクタを使用し、ための第二の要素値で初期化されます要素を持つリストを作成することができます。
関連ノートで、なぜ持っていません リスト内の容量機能?
リストに新しい要素を追加するコストがベクトルの場合よりもはるかに少ないので、それは意味がありません。
のstd ::ベクトルは、そのような必要はありません。 制限。私の質問は、なぜではありません 同じ技術を使用します 中(イディオムを破壊する/作成) 同様のstd ::リスト?
これは、制限ではありません。あなたは、このようなコンストラクタを使用していない場合ので、デフォルトの初期化は必要ありません。ベクトルのための真の同じ事ます。
だからあなたの質問は本当に「なぜリストに予備と能力の機能を持っていない?」されます。
その答えは、リストについては、事前にメモリを予約する理由はありませんということです - 新しい要素を追加するのreallocを必要としない&既存の要素のためにコピー決して、そこにリストの内容を保持するメモリが連続している必要はいない、とイテレータlist::push_back()
を行う際に無効にされません。
これらのすべては、vector<>::reserve()
の存在理由であり、vector<>
は生のメモリに配置new
を行いますなぜ新しい要素のための予備のメモリを持つことです。