std::copy
не выделяет элементы;Вы должны убедиться, что в целевом диапазоне достаточно места для размещения всех элементов в исходном диапазоне.
Обычный способ сделать это - использовать std::back_inserter
, который вызывает push_back
для вставки каждого элемента в контейнер:
std::copy(source.begin(), source.end(), std::back_inserter(destination));
Другой распространенный подход заключается в предварительном выделении достаточного пространства впоследовательность назначения, использующая resize
:
destination.resize(std::distance(source.begin(), source.end()));
std::copy(source.begin(), source.end(), destination.begin());
Разумеется, эти два подхода имеют различное поведение.При std::back_inserter
все элементы в последовательности сохраняются, а новые элементы вставляются после существующих элементов.При подходе resize
все существующие элементы перезаписываются.Вы также можете использовать подход resize
и сохранить любые существующие элементы:
const std::size_t original_size = destination.size();
destination.resize(destination.size() +
std::distance(source.begin(), source.end());
std::copy(source.begin(), source.end(), destination.begin() + original_size);
(для этого необходимо, чтобы destination
был произвольно доступным контейнером, таким как std::vector
; в противном случае выдолжны соответствующим образом изменить код.)