2011-10-21 20 views
0

コンテナの初期化に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: 
+2

あなたはあなたの古い質問に戻って、いくつかの答えを受け入れる必要があります代わりに、あなただけのlistコンストラクタを使用することができます。 –

+0

「初期化」はC++で特別な意味を持ちます。これは、オブジェクト定義の一環として行われる1回限りの処理です。例えば、 'list_2'は空のベクトルとして初期化されます。 – MSalters

答えて

3

list_2には、ソース範囲をコピーする場所がありません。十分なスペースを確保するか、挿入子イテレータを使用する必要があります。 assignメンバ関数の

std::list<std::string> list_2(list_1.begin(), list_1.end()); 

またはさらに:

list_2.assign(list_1.begin(), list_1.end()); 
+0

と同様に 'insert(It1、It2、It2)' :) +1 – sehe

1

あなたはむしろlist_2.beginからイテレータよりも、std::back_inserterから得たことを、back_insert_iteratorを必要としています。後者は、copyが挿入しようとしているアイテムにメモリを割り当てません。

2

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

関連する問題