быстрый способ скопировать один вектор в другой



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



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);
}


Как вы это делаете?

1476   7  

7 ответов:

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

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

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

это будет работать, но более простой способ-это

vector<int> new_(original);

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

мой любимый:

a = b;

здесь a и b векторы.

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

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

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

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

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

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

new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2

прямого ответа:

  • использовать = оператор

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

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

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

внимание:

  • не используйте std::vector::swap

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

  • глубоко или мелко понял?

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

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

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

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

ссылки

страница std::vector ВКЛ cplusplus.com

в случае, если вектор уже существовал, и вы хотели просто скопировать, вы могли бы сделать это:

newVec.resize(oldVec.size());
memcpy(&newVec.at(0), &oldVec.at(0), oldVec.size());

Comments

    Ничего не найдено.