Может ли copy () использоваться для инициализации контейнера? - PullRequest
0 голосов
/ 22 октября 2011

Можно ли использовать 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: 

Ответы [ 3 ]

3 голосов
/ 22 октября 2011

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() );
2 голосов
/ 22 октября 2011

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());

Возможности ... бесконечны

1 голос
/ 22 октября 2011

Вам нужно получить back_insert_iterator, полученный от std::back_inserter, а не итератор от list_2.begin.Последний не выделяет память для элементов, которые copy пытается вставить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...