У меня есть два вектора:
std::vector<int> v1, v2;
// Filling v1
...
А теперь мне нужно скопировать v1
в v2
. Есть ли какие-либо основания предпочесть
v2 = v1;
to
std::copy (v1.begin(), v1.end(), v2.begin());
(или наоборот)?
У меня есть два вектора:
std::vector<int> v1, v2;
// Filling v1
...
А теперь мне нужно скопировать v1
в v2
. Есть ли какие-либо основания предпочесть
v2 = v1;
to
std::copy (v1.begin(), v1.end(), v2.begin());
(или наоборот)?
Обычно я бы предпочел v2 = v1
:
std::copy
не будет работать, если v2
не имеет той же длины, что и v1
(он не будет изменять его размер, поэтому он сохранит некоторые из лучших элементов старого элемента (v2.size() > v1.size()
и перезапишет некоторые случайные данные, используемые в другом месте в худшем случае программыv1
истекает (и вы используете С++ 11), вы можете легко изменить его на move
содержимоеstd::copy
, так как разработчики, вероятно, использовали бы std::copy
внутренне, если бы это давало преимущество в производительности.В заключение, std::copy
менее выразителен, может сделать неправильную вещь и даже не быстрее. Поэтому нет никакой причины использовать его здесь.
Вызов std::copy
может попытаться получить доступ к элементам за пределами конечного вектора.
Использовать назначение.
Это не ваша задача для микро-оптимизации: ответственность библиотечного писателя и, в конечном счете, ответственность компилятора.
Вы можете сделать свой код произвольно быстро, если он не должен быть правильным.
В случае copy
, однако, довольно сомнительно, даже ли это быстрее, и это, конечно, неверно для общего случая.
Если v2
недостаточно велик, вы получите переполнение буфера, если используете copy
, как вы.
Вы можете использовать итератор обратной вставки, который будет вызывать push_back на v2
. Однако это может привести к нескольким перераспределениям в зависимости от того, насколько велика v1
.
copy(v1.begin(), v1.end(), back_inserter(v2));
Вам лучше позволить vector
правильно управлять вещами. Оператор присваивания выполняет это, как и vector::assign
:
v2.assign(v1.begin(), v1.end());
У меня есть подозрение, что оператор присваивания реализован в терминах vector::assign
.
Это короче.
std::copy
предназначен в основном для копирования разделов контейнеров. Если вам нужно скопировать весь контейнер, вы также можете использовать конструктор копирования.
Назначение, безусловно. В более общем плане, в любое время, когда размер вектора может измениться или изменить все содержимое вектора, вы должны предпочесть функции-члены. Единственное время std::copy
было бы уместно, если вы только полностью заменяете небольшой диапазон внутри вектора.
Назначение более четкое и внутренне использует std::copy
(или unitizalized_copy
_M_allocate_and_copy
размер и емкость), или, таким образом, показатели одинаковы.