それはそのストレージを成長させる必要がある場合、それは要素をコピーすることができるようにコピーコンストラクタがvector
によって必要とされます。あなたはvector
のための文書を読むことができます
TはCopyAssignableと コピーコンストラクトの要件を満たす必要があります。 (C++ 11まで)
に課される要件は、 コンテナで実行される実際の操作によって異なります。一般に、要素タイプは完全な タイプであり、消去可能の要件を満たしている必要がありますが、多くのメンバ関数 は厳しい要件を課しています。 (C++ 11以降)
要素に課される要件は、コンテナで実行される実際の操作( )によって異なります。一般に、 要素タイプが消去可能の要件を満たしている必要がありますが、多くのメンバ 関数は厳しい要件を課しています。 アロケータがアロケータの完全性の要件を満たしている場合、このコンテナ(ただし、 のメンバーではない)は、不完全な要素型でインスタンス化できます。
いくつかのログが出力が
create 1
create 2
create 3
copy 1
copy 2
ですから、emplace_back
要素を作成するために必要なコンストラクタを使用しないことが可能であるあなたが
For this code
class MyClass
{
public:
typedef enum
{
e1 = 1,
e2 = 2,
e3 = 3,
} Type;
private:
Type _type;
public:
MyClass(Type type): _type(type) { std::cout << "create " << type << "\n"; };
MyClass(const MyClass& other) { std::cout << "copy " << other._type << "\n"; }
};
int main() {
std::vector<MyClass> list;
list.reserve(2);
list.emplace_back(MyClass::e1);
list.emplace_back(MyClass::e2);
list.emplace_back(MyClass::e3);
}
に何が起こっているのか理解するのを助けることができますストレージを拡張する必要がある場合はコピーコンストラクタを呼び出します。 reserve
には、十分な容量を事前に呼び出して、コピーコンストラクターを呼び出す必要がなくなります。
あなたが本当にそれはコピー構築可能になりたくない何らかの理由で、あなたはlist
として代わりにstd::vector
のstd::list
を使用することができた場合はリンクリストとして実装され、それは要素を移動する必要はありません。
http://coliru.stacked-crooked.com/a/16f93cfc6b2fc73c
問題を解決するには、デフォルトの移動コンストラクタを追加します。可動式を望まない場合は、オプションがさらに制限されます –
ありがとう、私は移動コンストラクタを書くことを選択します。 – wqyfavor