Копирование массива в СИ
У меня есть заданный массив array_1, можно как то создать точно такой же массив array_2? или это придется делать в цикле с i?
Отслеживать
задан 1 апр 2020 в 10:51
13 3 3 бронзовых знака
Приведи пример того, что не получилось. Это «превентивный» вопрос. То есть из серии «я ничего не попробовал, скажите, можно ли так попробовать»? Ответ: можно. Пробуй. Если не получится, покажи проблемное место. Пока выглядит как попытка узнать решение для учебного задания. Я отмечаю как «Рекомендовать закрытие» вопроса. Дальше пусть модераторы решают.
Как скопировать массив ?
Как правильно скопировать массив?
Всем привет, есть массив фамилий, я его расставляю по алфавиту и вывожу, все вроде бы ок, но мне.
Массив: Как скопировать двумерный массив в другой массив?
Как скопировать двумерный массив в другой массив?
Объвить массив а как на картинке, затем в массив b скопировать значения массива a
Помогите пожалуйста с заданием. Объвить массив а как на картинке, затем в массив b скопировать.
Как в массив скопировать массив, который заполнен через указатели
Есть два файла допусти. Суть вопроса в том, что находится во втором файле. Как записать? car.h .
Создать копию массива в C++
В этом посте мы обсудим, как создать копию массива в C++.
1. Использование std::copy
Рекомендуемое решение для копирования всех элементов из массива в другой массив — использование стандартного алгоритма. std::copy от заголовок. В следующем примере кода показан вызов этой функции:
const int n = 5 ;
int dest [ n ] ;
std :: copy ( std :: begin ( src ) , std :: end ( src ) , std :: begin ( dest ) ) ;
for ( int &i : dest ) <
std :: cout << i << ' ' ;
результат:
1, 3, 5, 7, 9
Мы также можем использовать std::n_copy алгоритм из заголовок, как показано ниже:
const int n = 5 ;
int dest [ n ] ;
std :: copy_n ( src , n , dest ) ;
for ( int &i : dest ) <
std :: cout << i << ' ' ;
результат:
1, 3, 5, 7, 9
2. Использование конструктора копирования
Начиная с C++11, мы можем напрямую копировать std::array с оператором присваивания или конструктором копирования. Это не работает для массивов в стиле C.
const int n = 5 ;
std :: array < int , n >src = < 1 , 3 , 5 , 7 , 9 >;
std :: array < int , n >dest = src ; // или, std::array
for ( int &i : dest ) <
std :: cout << i << ' ' ;
результат:
1, 3, 5, 7, 9
3. Использование цикла
Другим решением является перебор исходного массива с использованием цикла for на основе индекса и добавление каждого встречающегося элемента в его правильную позицию в целевом массиве. Это приведет к простому коду ниже:
const int n = 5 ;
int dest [ n ] ;
for ( int i = 0 ; i < n ; i ++ ) <
dest [ i ] = src [ i ] ;
for ( int &i : dest ) <
std :: cout << i << ' ' ;
результат:
1, 3, 5, 7, 9
4. Использование std::memcpy
Для массивов Тип POD (обычные старые данные) как int, char и т. д., мы можем выполнить двоичную копию массива, используя std::memcpy функция. Вот как будет выглядеть код.
const int n = 5 ;
int dest [ n ] ;
std :: memcpy ( &dest , &src , sizeof ( src ) ) ;
for ( int &i : dest ) <
std :: cout << i << ' ' ;
результат:
1, 3, 5, 7, 9
Это все о создании копии массива в C++.
Оценить этот пост
Средний рейтинг 4.93 /5. Подсчет голосов: 15
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Подписывайся
0 Комментарии
Встроенные отзывы
Просмотреть все комментарии
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации
- Все проблемы
- Практика DSA
- 100 самых популярных задач
- 50 лучших классических задач
- Лучшие алгоритмы
- Компилятор С/С++
- Компилятор Java
- Компилятор Python
- Компилятор JavaScript
- компилятор PHP
- Компилятор C#
- Свяжитесь с нами
- Политика конфиденциальности
- условия обслуживания
- Подпишитесь на новые публикации
Techie Delight © 2023 Все права защищены.
Этот веб-сайт использует файлы cookie. Используя этот сайт, вы соглашаетесь с использованием файлов cookie, нашей политикой, условиями авторского права и другими условиями. Читайте наши Политика конфиденциальности. Понятно
Как создать копию массива значений и массива указателей без std?
А как сделать копию без массива значений(int *keys_) и массива указателей(Node **children_) без std не понятно. Изначальный объект надо удалить, поэтому сслыки можно скопировать, хотя не уверен.
- Вопрос задан более года назад
- 419 просмотров
4 комментария
Простой 4 комментария
Не до конца понятно задание.
int *keys_ — это массив или просто указатель на одно число? Если массив то какова размерность?
Node **children_ — каков размер этого массива?
int count_ — возможно размер?
Ну а в целом:
— для keys выделяй память в размер массива и просто скопируй память (например memcpy)
— для children_ также выделяй память и копируй, на сколько я понял, сами объекты Node копировать не нужно, только их ссылки
calculator212 @calculator212
Что вообще значит без std или имеется ввиду copy? В c++ юзают copy в C memcpy, но можете написать свой велосипед по копированию.
Если int *keys_; указатель на массив, то передаете в функцию указатель на него и размер, создаете новый массив и выделяете ему память, а потом копируете значения в цикле, Node **children_ +/- тут не скажу сразу, т.к. непонятно что за структура данных под капотом, если список то копируете как список, если массив, то как массив.
Евгений Шатунов @MarkusD Куратор тега C++
поэтому сслыки можно скопировать
В представленном участке определения типа ссылок нет.
Изначальный объект надо удалить
А как сделать копию без массива значений и массива указателей без std не понятно.
Как это не понятно? В нули их и дело с концом.
Т.к. это полностью твой участок кода, только тебе полностью ясна вся его суть. Я на это смотрю со своей стороны и абсолютно не понимаю этот код. Равно как я не понимаю и твой вопрос, в котором ты высказываешь свое личное мнение как конечное и очевидное остальным людям.
Мне интересно: почему тебе не понятно, как сделать копию без массива значений и массива указателей без std? Зачем тебе в этом вопросе std?
Я не понимаю цели использовать struct вместе с private . Можешь ли ты объяснить свой ход мыслей, приведший к этой комбинации?
Я не понимаю цели существования голых указателей в полях этой структуры. Какой смысл ты вкладываешь в существование этих голых указателей? Особенно двойного указателя.
Без точного понимания, что стоит за указателями в классе (это динамические массивы или что-то другое) тут не дать правильного ответа.
Но в общем случае, если предположить, что keys и children это указатели на динамическую память, то если первоначальный объект удаляется, указатели можно просто скопировать (т.е. скопировать сами указатели, а не сделать копию памяти на которую указывает указатель), а на прежнем месте указатели обнулить, чтоб память выделенная по указателю не освободилась в процессе удаление первоначального объекта.
Это как с rvalue ссылками и move семантикой, но вам ничего не мешает делать то же самое руками.
Но можно воспользоваться средствами С++ — для этого реализуйте оператор перемещающего присваивавания и/или конструктор перемещения.
Решения вопроса 1
Wataru @wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Чтобы скопировать массив можно воспользоваться memcpy , или делать это циклом.
Массив указателей от массива значений не отличается ничем. Просто там значения — это указатели. Аккуратно не допустите ошибки при использовании sizeof — если ему передать сам массив (указатель), то это будет размер указателя, а не всего массива. Надо брать размер одного элемента и домножать на их количество.
Если изначальный объект можно удалить, то вам надо переопределить оператор перемещения, а не копирования. Внутри ваши массивы — это просто указатели и их можно перемещать как переменные:
keys_ = node.keys_; node.keys_ = nullptr;
Не забудьте изначальное место затереть нулевым указателем, чтобы нечайнно потом два раза не удалить.
Так делать при копировании нельзя — ибо вы создаете несколько указателей на один и тот же массив и вообще непонятно, кто потом должен это удалять. Только при перемещении.
Когда вы определили оператор перемещения (или конструктор перемещения), то далее оберните элемент источник в std::move() при присваивании или передаче в конструктор. Тогда вызовется действительно перемещающий метод.