コンテナの初期化にcopy()を使用できますか?次のコードでは、実行時エラーが発生します: "反復可能でないリストイテレータ"。これの理由は何でしょうか?おかげcopy()をコンテナの初期化に使用できませんか?
string a[] = {"00", "11", "22"};
list<string> list_1(a, a+3), list_2;
copy(list_1.begin(), list_1.end(), list_2.begin()); // error:
コンテナの初期化にcopy()を使用できますか?次のコードでは、実行時エラーが発生します: "反復可能でないリストイテレータ"。これの理由は何でしょうか?おかげcopy()をコンテナの初期化に使用できませんか?
string a[] = {"00", "11", "22"};
list<string> list_1(a, a+3), list_2;
copy(list_1.begin(), list_1.end(), list_2.begin()); // error:
list_2
には、ソース範囲をコピーする場所がありません。十分なスペースを確保するか、挿入子イテレータを使用する必要があります。 assign
メンバ関数の
std::list<std::string> list_2(list_1.begin(), list_1.end());
またはさらに:
list_2.assign(list_1.begin(), list_1.end());
と同様に 'insert(It1、It2、It2)' :) +1 – sehe
あなたはむしろlist_2.begin
からイテレータよりも、std::back_inserter
から得たことを、back_insert_iterator
を必要としています。後者は、copy
が挿入しようとしているアイテムにメモリを割り当てません。
string a[] = {"00", "11", "22"};
list<string> list_1(a, a+3);
多くのオプション:
// #include <iterator>
list<string> list_2;
copy(list_1.begin(), list_1.end(), std::back_inserter(list_2));
または
list<string> list_2(list_1.begin(), list_1.end()); // range ctor
または
list<string> list_2(list_1); // copy ctor
かさえ:
list<string> list_2;
list_2.assign(list_1.begin(), list_1.end()); // range assignment
か:
list_2.insert(list_2.end(), list_1.begin(), list_1.end()); // range insert
か:
vector<string> vec(list_1.size()); // pre-allocating ctor
copy(list_1.begin(), list_1.end(), vec.begin());
か:
vector<string> vec;
// ....
vec.clear();
vec.resize(list_1.size()); // pre-allocate existing vector
copy(list_1.begin(), list_1.end(), vec.begin());
可能性がある...てendl
あなたはあなたの古い質問に戻って、いくつかの答えを受け入れる必要があります代わりに、あなただけの
list
コンストラクタを使用することができます。 –「初期化」はC++で特別な意味を持ちます。これは、オブジェクト定義の一環として行われる1回限りの処理です。例えば、 'list_2'は空のベクトルとして初期化されます。 – MSalters