Я предпочитаю два способа:
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);
}
Как ты это делаешь?
Ответы:
Ваш второй пример не работает, если вы отправляете аргумент по ссылке. Вы имели в виду
Это будет работать, но более простой способ
источник
original
является копией аргумента функции.Они не одинаковы, правда? Один - копия, другой - своп . Отсюда и имена функций.
Мой любимый это:
Где
a
иb
находятся векторы.источник
a = b
то нет. Назначение означает: сделатьa
равнымиb
без измененияb
. В противоположность этому ,std::swap(a, b)
променяет их содержание (такb
«ssize
теперь будет то , чтоa
» s было раньше). Возможно, вы думаете об операции перемещения (как это происходит в C ++ 11, но не в обычном присваивании, подобном этому). Такой шаг мог бы оставитьb
в ап, гм, «интересно» состояние - см stackoverflow.com/questions/17730689/...&&
. Эта версия будет использоваться только для ссылки. Это не будет соответствовать ни одному неконстантному значению (какb
в моем примере выше). Вы можете превратитьсяb
в один, сказавa = std::move(b);
Смотрите en.cppreference.com/w/cpp/language/value_category для еще больших уровней сложности.Это еще один правильный способ сделать копию вектора, просто используйте его конструктор:
Это даже проще, чем использовать
std::copy
для перехода весь вектор от начала до конца кstd::back_insert
новому вектору.При этом ваш
.swap()
экземпляр не является копией, он заменяет два вектора. Вы бы изменили оригинал, чтобы больше ничего не содержать! Который не является копией.источник
a = b;
что у меня уже есть поле участника,a
и мне просто нужно присвоить ему новое значение отb
Прямой ответ:
=
оператораМы можем использовать открытую функцию-член
std::vector::operator=
контейнераstd::vector
для назначения значений из вектора в другой.Кроме того, функция конструктора также имеет смысл. Функция конструктора с другим вектором в качестве параметра (например,
x
) создает контейнер с копией каждого из элементовx
в том же порядке.Внимание:
std::vector::swap
std::vector::swap
это не копирование вектора в другой, это на самом деле замена элементов двух векторов, как и предполагает его название. Другими словами, исходный вектор для копирования изменяется послеstd::vector::swap
вызова, что, вероятно, не то, что вы ожидаете.Если элементы в исходном векторе являются указателями на другие данные, то иногда требуется глубокая копия.
Согласно википедии:
На самом деле, в C ++ в настоящее время нет встроенного способа сделать глубокое копирование. Все вышеперечисленные способы мелкие. Если необходима глубокая копия, вы можете пройти вектор и сделать копии ссылок вручную. Альтернативно, итератор может рассматриваться для обхода. Обсуждение итератора выходит за рамки этого вопроса.
Ссылки
Страница
std::vector
на cplusplus.comисточник
Вы не должны использовать swap для копирования векторов, это изменит «оригинальный» вектор.
вместо этого передайте оригинал в качестве параметра новому.
источник
источник
Если вектор УЖЕ существует и вы хотите просто скопировать, вы можете сделать это:
источник
newVec = oldVec
то же самое, что и один из других ответов.