У меня есть два вектора:
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 размер и емкость), или, таким образом, показатели одинаковы.