copy()不能用于初始化容器吗?

时间:2011-10-21 22:39:21

标签: c++ list stl copy

copy()可用于初始化容器吗?以下代码有一个运行时错误:“list iterator not dereferencable”。这是什么原因?感谢

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: 

3 个答案:

答案 0 :(得分:3)

list_2没有空间来复制源范围。您必须保留足够的空间,或使用插入器迭代器。或者,您可以使用list构造函数:

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

assign成员函数:

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

答案 1 :(得分: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());

可能性是......无穷无尽的

答案 2 :(得分:1)

您需要back_insert_iterator来自std::back_inserter,而不是来自list_2.begin的迭代器。后者不为copy试图插入的项目分配内存。