Копирование std::vector: предпочитает назначение или std:: copy?

У меня есть два вектора:

std::vector<int> v1, v2;

// Filling v1
...

А теперь мне нужно скопировать v1 в v2. Есть ли какие-либо основания предпочесть

v2 = v1;

to

std::copy (v1.begin(), v1.end(), v2.begin());

(или наоборот)?

Ответ 1

Обычно я бы предпочел v2 = v1:

  • Он короче и делает более понятным
  • std::copy не будет работать, если v2 не имеет той же длины, что и v1 (он не будет изменять его размер, поэтому он сохранит некоторые из лучших элементов старого элемента (v2.size() > v1.size() и перезапишет некоторые случайные данные, используемые в другом месте в худшем случае программы
  • Если v1 истекает (и вы используете С++ 11), вы можете легко изменить его на move содержимое
  • Потенциальное назначение вряд ли будет медленнее, чем std::copy, так как разработчики, вероятно, использовали бы std::copy внутренне, если бы это давало преимущество в производительности.

В заключение, std::copy менее выразителен, может сделать неправильную вещь и даже не быстрее. Поэтому нет никакой причины использовать его здесь.

Ответ 2

Вызов std::copy может попытаться получить доступ к элементам за пределами конечного вектора.

Использовать назначение.

Это не ваша задача для микро-оптимизации: ответственность библиотечного писателя и, в конечном счете, ответственность компилятора.

Вы можете сделать свой код произвольно быстро, если он не должен быть правильным.

В случае copy, однако, довольно сомнительно, даже ли это быстрее, и это, конечно, неверно для общего случая.

Ответ 3

Если 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.

Ответ 4

Это короче.

std::copy предназначен в основном для копирования разделов контейнеров. Если вам нужно скопировать весь контейнер, вы также можете использовать конструктор копирования.

Ответ 5

Назначение, безусловно. В более общем плане, в любое время, когда размер вектора может измениться или изменить все содержимое вектора, вы должны предпочесть функции-члены. Единственное время std::copy было бы уместно, если вы только полностью заменяете небольшой диапазон внутри вектора.

Ответ 6

Назначение более четкое и внутренне использует std::copy (или unitizalized_copy _M_allocate_and_copy размер и емкость), или, таким образом, показатели одинаковы.