быстрый способ скопировать один вектор в другой - PullRequest
131 голосов
/ 14 марта 2009

Я предпочитаю два способа:

void copyVecFast(const vec<int>& original)
{
  vector<int> newVec;
  newVec.reserve(original.size());
  copy(original.begin(),original.end(),back_inserter(newVec));
}

void copyVecFast(vec<int>& original)
{

  vector<int> newVec;
  newVec.swap(original); 
}

Как ты это делаешь?

Ответы [ 7 ]

217 голосов
/ 14 марта 2009

Они не одинаковы, правда? Один - копия, другой - своп . Отсюда и имена функций.

Мой любимый это:

a = b;

Где a и b - векторы.

109 голосов
/ 14 марта 2009

Ваш второй пример не работает, если вы отправляете аргумент по ссылке. Вы имели в виду

void copyVecFast(vec<int> original) // no reference
{

  vector<int> new_;
  new_.swap(original); 
}

Это бы сработало, но более простой способ -

vector<int> new_(original);
63 голосов
/ 14 марта 2009

Это еще один действительный способ сделать копию вектора, просто используйте его конструктор:

std::vector<int> newvector(oldvector);

Это даже проще, чем использовать std::copy, чтобы пройти весь вектор от начала до конца до std::back_insert их в новый вектор.

Как говорится, ваш .swap() один не является копией, вместо этого он меняет два вектора. Вы бы изменили оригинал, чтобы больше ничего не содержать! Который не является копией.

13 голосов
/ 14 марта 2009

Вы не должны использовать swap для копирования векторов, это изменит «оригинальный» вектор.

вместо оригинала передайте оригинал как параметр.

11 голосов
/ 31 августа 2016
new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2
10 голосов
/ 28 декабря 2017

Прямой ответ:

  • Используйте оператор =

Мы можем использовать открытую функцию-член std::vector::operator= контейнера std::vector для назначения значений из вектора в другой.

  • Использовать функцию конструктора

Кроме того, функция конструктора также имеет смысл. Функция конструктора с другим вектором в качестве параметра (например, x) создает контейнер с копией каждого из элементов в x в том же порядке.

Внимание:

  • Не использовать std::vector::swap

std::vector::swap - это не копирование вектора на другой, это фактически замена элементов двух векторов, как и предполагает его название. Другими словами, исходный вектор для копирования изменяется после вызова std::vector::swap, что, вероятно, не то, что вы ожидаете.

  • Глубокая или мелкая копия?

Если элементы в исходном векторе являются указателями на другие данные, то иногда требуется глубокая копия.

Согласно википедии:

Глубокая копия, означающая, что поля разыменовываются: вместо ссылок на копируемые объекты создаются новые объекты копирования для любых ссылочных объектов, а ссылки на них помещаются в B.

На самом деле, в C ++ в настоящее время нет встроенного способа сделать глубокое копирование. Все вышеперечисленные способы мелкие. Если необходима глубокая копия, вы можете пройти вектор и сделать копию ссылок вручную. Альтернативно, итератор может рассматриваться для обхода. Обсуждение итератора выходит за рамки этого вопроса.

Ссылки

Страница std::vector на cplusplus.com

0 голосов
/ 21 сентября 2015

Если вектор УЖЕ существует и вы хотите просто скопировать, вы можете сделать это:

newVec.resize(oldVec.size());
memcpy(&newVec.at(0), &oldVec.at(0), oldVec.size());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...