Как скопировать один вектор в другой c
Перейти к содержимому

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

  • автор:

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

On Fri, 21 Oct 2005 13:54:45 +0400, Аноним <0@users.rsdn.ru>wrote:

> Как скопировать один вектор в другой?

Точно также как int.


Maxim Yegorushkin

Posted via RSDN NNTP Server 2.0 beta
Re[2]: Копирование вектора

От: ArtDenis
Дата: 21.10.05 09:59
Оценка:

Ну-ну. Ты сейчас насоветуешь. Неужели один вектор можно скопировать в другой вот так:

 std::vector v1, v2; . memcpy(&v1, &v2, sizeof(std::vector));

Posted via RSDN NNTP Server 1.9
Re[3]: Копирование вектора

От: MaximE
Дата: 21.10.05 10:02
Оценка: +1

On Fri, 21 Oct 2005 13:59:22 +0400, ArtDenis <15178@users.rsdn.ru>wrote:

> Ну-ну. Ты сейчас насоветуешь. Неужели один вектор можно скопировать в другой вот так:
>
>

> > std::vector v1, v2; > > . > > memcpy(&v1, &v2, sizeof(std::vector)); >

Можно. Но за свою изобретательность тебе придется расплатиться.


Maxim Yegorushkin

Posted via RSDN NNTP Server 2.0 beta
Re[2]: Копирование вектора

От: Аноним
Дата: 21.10.05 11:05
Оценка:

Здравствуйте, MaximE, Вы писали:

ME>On Fri, 21 Oct 2005 13:54:45 +0400, Аноним wrote:

>> Как скопировать один вектор в другой?

А если серьезно? Разве для вектора определен оператор присваивания? Трактуемое компилятором присваивание по умолчанию как побитовое копирование думаю не совсем то что нужно.

Re: Копирование вектора

От: Bell
Дата: 21.10.05 11:08
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Как скопировать один вектор в другой?

#include #include using namespace std; int main() < vectorint> v1, v2; //1 v1 = v2; //2 v1.assign(v2.begin(), v2.end()); //3 v1.resize(v2.size()); copy(v2.begin(), v2.end(), v1.begin()); //4 v1.clear(); v1.insert(v1.begin(), v2.begin(), v2.end()); //С помощью конструкторов //5 vectorint> v3(v2); //6 vectorint> v4(v2.begin(), v2.end()); return 0; >

Любите книгу — источник знаний (с) М.Горький
Re[3]: Копирование вектора

От: Lorenzo_LAMAS
Дата: 21.10.05 11:08
Оценка:

А>А если серьезно? Разве для вектора определен оператор присваивания? Трактуемое компилятором присваивание по умолчанию как побитовое копирование думаю не совсем то что нужно.

А если серьезно, то для вектора перегружен оператор присваивания.

Of course, the code must be complete enough to compile and link.
Re[3]: Копирование вектора

От: Bell
Дата: 21.10.05 11:12
Оценка: +1

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, MaximE, Вы писали:

ME>>On Fri, 21 Oct 2005 13:54:45 +0400, Аноним wrote:

>>> Как скопировать один вектор в другой?

А>А если серьезно? Разве для вектора определен оператор присваивания?
Определен.

А>Трактуемое компилятором присваивание по умолчанию как побитовое копирование думаю не совсем то что нужно.

Срочно выкинуть книгу, в которой говорится о побитовом копировании, как способе реализации оператора присваивания по умолчанию, и воспользоваться поиском по форуму для формирования правильного представления о природе этого оператора.

Любите книгу — источник знаний (с) М.Горький
Re[4]: Копирование вектора

От: Lorenzo_LAMAS
Дата: 21.10.05 11:20
Оценка:

B>Срочно выкинуть книгу, в которой говорится о побитовом копировании, как способе реализации оператора присваивания по умолчанию,

А заодно скажи фамилию автора для занесения в скрижали позорища!

Of course, the code must be complete enough to compile and link.
Re[5]: Копирование вектора

От: Аноним
Дата: 21.10.05 11:24
Оценка:

Здравствуйте, Lorenzo_LAMAS, Вы писали:

B>>Срочно выкинуть книгу, в которой говорится о побитовом копировании, как способе реализации оператора присваивания по умолчанию,

L_L>А заодно скажи фамилию автора для занесения в скрижали позорища!

Прошу прощения, похоже мои слова были неправильно истолкованы. Имелось в виду что если для класса не определен оператор =, то компилятор трактует присваивание как побитовое копирование.

Re[6]: Копирование вектора

От: CrystaX https://crystax.me/
Дата: 21.10.05 11:30
Оценка: 1 (1) +1

Здравствуйте, <Аноним>, Вы писали:

А>Прошу прощения, похоже мои слова были неправильно истолкованы. Имелось в виду что если для класса не определен оператор =, то компилятор трактует присваивание как побитовое копирование.

Если для класса не определен оператор копирования, то компилятор трактует присваивание как почленное копирование, а вовсе не побитовое.

Re[6]: Копирование вектора

От: Bell
Дата: 21.10.05 11:33
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Прошу прощения, похоже мои слова были неправильно истолкованы. Имелось в виду что если для класса не определен оператор =, то компилятор трактует присваивание как побитовое копирование.

Слова истолкованы правильно. Не стОит защищать автора — побитовое копирование — это совсем не то, сто делает оператор присваивания по умолчанию (если быть абсолютно точным, то в ряде случаев оператор вполне может реализован как memcpy, но в общем случае это не так).
Чтобы не быть голословным:

12.8/13 The implicitly-defined copy assignment operator for class X performs memberwise assignment of its subobjects.

Любите книгу — источник знаний (с) М.Горький
Re[2]: Копирование вектора

От: Николай Ганичев
Дата: 23.10.05 13:46
Оценка: -1

Здравствуйте, Bell, Вы писали:

А>>Как скопировать один вектор в другой?

B>

B>#include B>#include B>using namespace std; B>int main() B> < B>vectorint> v1, v2; B> //1 B> v1 = v2; B> //2 B> v1.assign(v2.begin(), v2.end()); B> //3 B> v1.resize(v2.size()); B> copy(v2.begin(), v2.end(), v1.begin()); B> //4 B> v1.clear(); B> v1.insert(v1.begin(), v2.begin(), v2.end()); B> //С помощью конструкторов B> //5 B> vectorint> v3(v2); B> //6 B> vectorint> v4(v2.begin(), v2.end()); B> return 0; B>> B>

Это всё нужно написать только для того, чтобы скопировать вектор?! Синтаксический оверхед.

Re[3]: Копирование вектора

От: Bell
Дата: 23.10.05 14:44
Оценка:

Здравствуйте, Николай Ганичев, Вы писали:

НГ>Это всё нужно написать только для того, чтобы скопировать вектор?! Синтаксический оверхед.

Это было 6 различных способов коприрования, если кто не понял.

Любите книгу — источник знаний (с) М.Горький
Re[3]: Копирование вектора

От: Аноним
Дата: 24.10.05 07:32
Оценка:

AD>Ну-ну. Ты сейчас насоветуешь. Неужели один вектор можно скопировать в другой вот так:
AD>

AD>std::vector v1, v2; AD>. AD>memcpy(&v1, &v2, sizeof(std::vector)); AD>

А ты один int копируешь в другой тоже так?

Как скопировать один вектор в другой, если у них разные типы? С++

При условии, что MyType2 может быть построен из MyType1, как мне инициализировать второй вектор? Пробовал сделать так:

std::vector vec2 ; 

Отслеживать
задан 27 ноя 2021 в 7:41
ComeInRage ComeInRage
1,590 6 6 серебряных знаков 14 14 бронзовых знаков
а не получится ли «каша » с неизвестным состояний объектов.
27 ноя 2021 в 10:13

@ARHovsepyan ну у вас получается каша, если вы используете конструктор, принимающий в качестве аргумента другой класс?)

27 ноя 2021 в 11:10
это не одно и то же
27 ноя 2021 в 12:33

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

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

std::vector a ; std::vector b; std::transform( a.begin(), a.end(), // исходный вектор std::back_inserter(b), // результирующий вектор [](auto q) < return std::to_string(q) + "\n";>// функция преобразования ); 

я использовал back_inserter , который в данном случае просто скрывает push_back , но можно выделить память под результирующий вектор (через b.resize(a.size()); ) и потом можно просто указать b.begin()

6.3. Копирование вектора

Требуется скопировать содержимое одного vector в другой.

Имеется пара способов сделать это. Можно при создании vector использовать конструктор копирования, а можно использовать метод assign. Пример 6.3 показывает оба этих способа.

Пример 6.3. Копирование содержимого vector

using namespace std;

// Вспомогательная функция для печати содержимого вектора

void vecPrint (const vector& vec)

for (typename vector::const_iterator p = vec.begin();

vec2.assign(vec.begin(), vec.end()); // Копирование каждого элемента

vecPrint(vec2); // с помощью присвоения

vec2.assign(&foo[0], &foo[5]); // Присвоение работает для всего, что

vecPrint(vec2); // ведет себя как итератор

p = find(vec.begin(), vec.end(), «new»);

vec2.assign(vec.begin(), p); // Копирование подмножества полного диапазона

Копирование vector просто. Имеется два способа сделать это. Можно скопировать один vector в другой с помощью конструктора копирования, как и любой другой объект, а можно использовать метод assign. О конструкторе копирования сказать почти нечего. Просто передайте в него vector, который требуется скопировать, и все.

В этом случае vec2 будет содержать такое же число элементов, что и vec, и каждый из этих элементов будет копией элемента vec с таким же индексом. Каждый элемент копируется с помощью конструктора копирования string. Так как здесь используется конструктор, буфер vec2 имеет размер, достаточный для хранения всего, что есть в vec.

assign работает аналогично, за исключением того, что за кулисами выполняется дополнительная работа, связанная с тем, что теперь дело касается целевого vector который уже может содержать данные. Во-первых, требуется удалить элементы, которые оказались, так сказать, под ногами. Вначале assign для каждого из объектов, уже содержащихся в vec2, вызывает деструктор. После этого он проверяет размер буфера vec2, чтобы убедиться, что он достаточно большой, чтобы вместить то, что находится в vec. Если он не достаточен, assign изменяет размер буфера под размещение новых данных. Наконец, он копирует каждый элемент.

Кроме того, assign можно использовать для копирования подмножества последовательности. Например, если требуется скопировать подмножество элементов vec, просто укажите при вызове assign необходимый диапазон.

p = std::find(vec.begin(), vec.end(), «new»);

В этом случае assign скопирует все до, но не включая, p. Причиной этого является соглашение, по которому во всех контейнерах и алгоритмах стандартной библиотеки assign(first, last) копирует элементы, на которые указывает first, до, но не включая, элемент, на который указывает last. Такой диапазон, который включает первый элемент, но не включает последний, часто обозначается как (first, last).

Используйте assign или конструктор копирования вместо самостоятельного циклического перебора. Это значит, не копируйте каждый элемент, перебирая vec и помещая элементы в конец vec2 в цикле. Это потребует от вас большой избыточности кода и отключит все оптимизации, которые могут присутствовать в реализации assign и конструктора копирования стандартной библиотеки.

Читайте также

13.5.1. Копирование

13.5.1. Копирование Самый простой вариант создания резервной копии — использование команды cp (копирование файлов). Только в этом случае необходимо обязательно сохранять права доступа к файлу. Вот как может выглядеть команда, дублирующая директорию /home на примонтированном

8.4.1 Протоколы вектора расстояния

8.4.1 Протоколы вектора расстояния Самый простой протокол для сравнения маршрутизаторов использует счет попаданий между конечными точками пути. Некоторые улучшенные варианты оценивают стоимость или вес каждого из участков по пути следования. Например, участок попадания

Копирование

Копирование Вставьте компакт-диск в привод. Щелкните мышью на кнопке Копировать с диска (рис. 3.22). С помощью соответствующих флажков отметьте произведения, предназначенные для копирования. В строке состояния при этом будет отображаться количество выбранных

11.8. Представление динамического числового вектора

11.8. Представление динамического числового вектора ПроблемаТребуется иметь тип для манипулирования динамическими числовыми векторами.РешениеВы можете использовать шаблон valarray из заголовочного файла <valarray>. Пример 11.15 показывает, как можно использовать шаблон

11.9. Представление числового вектора фиксированного размера

11.9. Представление числового вектора фиксированного размера ПроблемаТребуется иметь эффективное представление числовых векторов фиксированного размера.РешениеВ программном обеспечении обычного типа часто более эффектный результат по сравнению с valarray дает

11.11. Вычисление нормы вектора

11.11. Вычисление нормы вектора ПроблемаТребуется найти норму (т. е. длину) числового вектора.РешениеМожно использовать функцию inner_product из заголовочного файла <numeric> для умножения вектора на самого себя, как показано в примере 11.21.Пример 11.21. Вычисление нормы вектора#include

Копирование

Копирование В этом примере мы копируем базу данных, находящуюся на диске D: удаленного сервера, в файл копии на диске F: той же самой удаленной машины. Мы направляем подробный отчет об операции в файл протокола в другом каталоге. Как обычно, пример является одной строкой:gbak

Копирование

Копирование BlindWrite Suite Сайт: http://www.blindwrite.comРазмер: 2,8 МбСтатус: SharewareЦена: $32Весьма популярная на Западе программа для точного копирования дисков. Ранее поставлялась в виде двух отдельных модулей – BlindRead, отвечавшего за сброс содержимого диска в файл-образ и собственно

1.11 Вектора

1.11 Вектора Встроенное в С++ понятие вектора было разработано так, чтобы обеспечить максимальную эффективность выполнения при минимальном расходе памяти. Оно также (особенно когда используется совместно с указателями) является весьма универсальным инструментом для

1.17 Полиморфные Вектора

1.17 Полиморфные Вектора У вас есть другая возможность – определить ваш векторный и другие вмещающие классы через указатели на объекты некоторого класса: class common (* //. *); class vector (* common** v; //. public: cvector(int); common* amp; elem(int); common* amp; operator[](int); //. *);Заметьте, что поскольку в таких

2.3.7 Указатели и Вектора

2.3.7 Указатели и Вектора Указатели и вектора в С++ связаны очень тесно. Имя вектора можно использовать как указатель на его первый элемент, поэтому пример с алфавитом можно было написать так:char alpha[] = «abcdefghijklmnopqrstuvwxyz»; char* p = alpha; char ch;while (ch = *p++) cout «„ chr(ch) „« » = » «« ch «« « = 0“ ««

5.5.5 Вектора Объектов Класса

5.5.5 Вектора Объектов Класса Чтобы описать вектор объектов класса, имеющего конструтор, этот класс должен иметь конструктор, который может вызваться без списка параметров. Нельзя использовать даже парметры по умолчанию. Например:table tblvec[10];будет ошибкой, так как для

Вектора, допускающие сложение

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

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

Они не то же самое, не так ли? Один — это копия, другой — своп. Следовательно, имена функций.

Мое любимое занятие:

a = b; 

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

Daniel Earwicker 13 март 2009, в 23:21
Поделиться

Фактически, подход передается по значению, компилятор вызывает конструктор копирования, а затем заменяет этот вновь созданный элемент. Вот почему rlbond предлагает вызвать конструктор копирования напрямую для достижения того же эффекта.

David Rodríguez — dribeas 14 март 2009, в 00:17

Однако вы не можете вызвать rlbon без функции, которая передает оригинал как val. В противном случае оригинал будет пустым. Второе решение гарантировало, что вы всегда будете звонить по значению, и, следовательно, вы не потеряете дату в исходном векторе. (Предполагая обмен сделок с указателями)

Eyad Ebrahim 31 март 2013, в 13:57
Разве это не переместит элементы b в a (оставив b с размером == 0)?
Jonathan. 23 окт. 2014, в 16:00

@Jonathan. Если вы говорите о a = b то нет. Назначение означает: сделать a равном b без изменения b . В отличие от этого std::swap(a, b) будет обмениваться своим содержимым (поэтому size b теперь будет таким, каким был a ) ранее. Возможно, вы думаете об операции перемещения (как это происходит в C ++ 11, но не в обычном присваивании, подобном этому). Такой шаг оставил бы b в «интересном» состоянии, см. Stackoverflow.com/questions/17730689/…

Daniel Earwicker 24 окт. 2014, в 11:39

Обратите внимание, что существует старый стандартный библиотечный класс C ++ с именем auto_ptr который неправильно реализовал присваивание, поэтому он выполнял перемещение.

Daniel Earwicker 24 окт. 2014, в 11:42

@Daniel Дэниел, на этой странице написано, что в C ++ 11, если вектор не является константой, оператор = является движением?

Jonathan. 24 окт. 2014, в 12:31
@Jonathan. На какой странице это сказано?
Daniel Earwicker 24 окт. 2014, в 12:47

@Daniel, извините эту страницу ( cplusplus.com/reference/vector/vector/operator= ), когда вы нажимаете на вкладки C ++

Jonathan. 24 окт. 2014, в 13:42
Daniel Earwicker 24 окт. 2014, в 15:29
Показать ещё 7 комментариев

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

std::vector newvector(oldvector); 

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *