Как сделать копию массива c

Обновлено: 07.07.2024

Четыре метода копирования массивов в Java: метод arraycopy (), метод clone (), метод copyOf () и copyOfRange ().

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

вJava Существует четыре способа реализовать копирование массива в Arrays: метод copyOf () и метод copyOfRange () класса Arrays, метод arraycopy () класса System и метод clone () класса Object. Использование этих четырех методов будет подробно описано ниже.

Используйте метод copyOf () и метод copyOfRange ()

Метод copyOf () и метод copyOfRange () класса Arrays могут реализовать копию массива. Метод copyOf () предназначен для копирования массива до указанной длины, а метод copyOfRange () предназначен для копирования указанной длины указанного массива в новый массив.

1. Используйте метод copyOf (), чтобы скопировать массив.

Формат синтаксиса метода copyOf () класса Arrays следующий: Среди них srcArray представляет массив, который нужно скопировать, а length представляет длину нового массива после копирования.

При копировании массива с помощью этого метода по умолчанию копирование начинается с первого элемента исходного массива (значение индекса равно 0), а длина целевого массива будет равна length. Если длина больше srcArray.length, целевой массив будет заполнен значением по умолчанию; если длина меньше srcArray.length, скопируйте в элемент длины (значение индекса length-1) и остановитесь.

Примечание. Если целевой массив уже существует, он будет восстановлен.

Пример 1

Предположим, что в массиве сохранено 5 оценок. Теперь нам нужно сохранить эти 5 оценок в новом массиве, оставив 3 запасных элемента для дальнейшей разработки.

Используйте метод CopyOf () класса Arrays, чтобы завершить код копирования массива следующим образом:


В приведенном выше коде, поскольку длина оценок исходного массива равна 5, а длина копируемого нового массива newScores равна 8, после копирования 5 элементов в исходном массиве, Содержимое остальных 3 элементов будет заполнено значениями по умолчанию.

Поскольку тип данных исходного массива scores - int, и после копирования массива с помощью метода Arrays.copyOf (scores, 8) возвращается тип Object [], поэтому вам нужно для изменения типа данных Object [] Приведение к типу int []. В то же время, поскольку тип данных оценок - int, значение по умолчанию - 0.

Результат выполнения показан ниже.

2. Используйте метод CopyOfRange (), чтобы скопировать массив.

Метод CopyOfRange () класса Arrays - это еще один метод копирования массива, и его синтаксис выглядит следующим образом:
Среди них srcArray представляет исходный массив; startIndex представляет начальный индекс для начала копирования, а целевой массив будет содержать элемент, соответствующий начальному индексу. Кроме того, startIndex должен быть между 0 и srcArray.length; EndIndex представляет конечный индекс, целевой массив не будет содержать элемент, соответствующий конечному индексу, endIndex должен быть больше или равен startIndex и может быть больше srcArray.length, если больше srcArray.length , целевой массив заполняется значением по умолчанию.

Примечание. Если целевой массив уже существует, он будет реконструирован.

Пример 2

Предположим, что существует массив с именем scores с 8 элементами. Теперь вам нужно определить новый массив с именем newScores. Элементы нового массива - это первые 5 элементов массива оценок, и порядок остается неизменным.

Используйте метод copyOfRange () класса Arrays для завершения кода копирования массива следующим образом:

В приведенном выше коде исходный массив оценок содержит 8 элементов. Используйте метод Arrays.copyOfRange (), чтобы скопировать массив в массив newScores длиной 5 и перехватить массив оценок. Достаточно 5 элементов.

Результат выполнения этой программы показан ниже.

Используйте метод arraycopy ()

Метод arraycopy () находится в классе java.lang.System. , Его грамматическая форма следующая:
Среди них srcArray указывает исходный массив; srcIndex указывает начальный индекс в исходном массиве; destArray указывает целевой массив; destIndex указывает начальный индекс в целевом массиве; length указывает длину копируемый массив.

При использовании этого метода для копирования массива длина + srcIndex должна быть меньше или равна srcArray.length, а length + destIndex должна быть меньше или равна destArray.length.

Примечание. Целевой массив должен уже существовать и не будет восстановлен, что эквивалентно замене некоторых элементов в целевом массиве.

Пример 3

Предполагая, что оценки 8 студентов сохранены в массиве scores, теперь нам нужно скопировать все элементы массива от второго элемента до конца в массив с именем newScores, длина 12 лет. Элементы в массиве scores располагаются, начиная с третьего элемента в массиве newScores.

Код для использования метода System.arraycopy () для выполнения функции замены элементов массива выглядит следующим образом:


В этой программе сначала определяется массив оценок, содержащий 8 элементов, затем определяется массив newScores, содержащий 12 элементов, а затем цикл for используется для обхода двух массивов An, элементы в выходном массиве. Наконец, используйте метод System.arraycopy () для замены 8 элементов из третьего элемента в массиве newScores на 8 значений элементов в массиве scores.

Результат выполнения этой программы показан ниже.


Примечание. При использовании метода arraycopy () обратите внимание, что именование этого метода нарушает соглашение об именах Java. То есть первая буква второй копии слова не пишется с заглавной буквы, но по соглашению она должна быть записана как arrayCopy. Просим читателей обращать внимание на написание имени метода при использовании этого метода.

Используйте метод clone ()

clone () метод Вы также можете скопировать массив. Этот метод является методом класса Object, Вы можете создать объект с отдельным пространством памяти. Поскольку массив также является классом Object, вы также можете использовать метод clone () объекта массива для копирования массива.

Возвращаемое значение метода clone () имеет тип Object, который должен быть приведен к соответствующему типу с помощью приведения. Его грамматическая форма относительно проста:
Пример инструкции выглядит следующим образом:

Пример 4

имеет массив оценок длиной 8. Поскольку он нужен программе, теперь нам нужно определить массив с именем newScores, содержащий все элементы в массиве оценок. Вы можете использовать клон () метод сложения оценок. Все элементы массива копируются в массив newScores. Код выглядит следующим образом:


В этой программе сначала определяется массив оценок длиной 8, и элементы в выходном массиве массива проходят цикл, а затем определяется и используется новый массив с именем newScores. Метод scores.clone () копирует элементы из массива scores в массив newScores. Наконец, выполните цикл по массиву newScores и выведите элементы массива.

Результат выполнения программы показан ниже.


Из результатов выполнения видно, что элементы массива scores и элементы массива newScores совпадают.

Я Java-программист обучения с/C++. Так я знаю, что Java имеет функции как системы.arraycopy(); чтобы скопировать массив. Мне было интересно, если есть функция в C или C++ скопировать массив. Я смог найти только выполнения копирование массива с помощью цикла for, указатели и т. д. Есть ли функция, что я могу использовать, чтобы скопировать массив?

Поскольку вы попросили решение на C++.

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

В C++ можно также использовать функции memcpy если члены массива под (то есть, по сути, типов, которые можно было бы использовать без изменений в C), но в целом, функции memcpy не быть разрешено. Как другие упомянули, функция использовать СТД::копия.

Сказав, что в C++ вы редко должны использовать сырые массивы. Вместо этого вы должны либо использовать одну из стандартных контейнеров (СТД::вектор является ближайшим к встроенному массиву, и также я думаю, что ближе всего к массивам Java — ближе, чем простые массивы c++, действительно —, но с std::deque будет или СТД::список может быть более подходящим в некоторых случаях) или, если вы используете C++11, с std::массив , который является очень близко к встроенные массивы, но с семантикой значений, как и другие типы C++. Все типы, которые я упомянул здесь могут быть скопированы путем присвоения или строительных копию. Кроме того, вы можете и"крест-копия" от второй к другому (и даже от встроенного массива) используя итератор синтаксис.

Это дает краткий обзор возможностей (я предполагаю, что все соответствующие заголовки были включены):

когда происходит копирование то значения массива bbb перезаписывает значения массива aaa.
Как добавить значения массива bbb к массиву aaa не терея данныи в aaa

Объявить массив А на 6 элементов, чтобы поместилось 3 своих, и 3 из элемента б. По другому, по идее, никак

ему 1 в другой нужно скопировать. можешь использовать memcpy, только зарание нужно узнать размер массива, вариант деления через sizeof неочень безопастный, есть более умный метод..

выглядет как-то так

ему 1 в другой нужно скопировать. можешь использовать memcpy, только зарание нужно узнать размер массива, вариант деления через sizeof неочень безопастный, есть более умный метод..

выглядет как-то так

очень интересный пример но я начинающий и кроме int и sizeof(T)) я не чего не пойму
может есть какая небудь функция

memcpy тоже так же работает как memmove а в начале блога я написал

"когда происходит копирование то значения массива bbb перезаписывает значения массива aaa.
Как добавить значения массива bbb к массиву aaa не терея данныи в aaa"

Как добавить значения массива bbb к массиву aaa не терея данныи в aaa"

добавить не скопировать, лол!

memcat вроде есть, но массив должен быть заведомо больше..
можешь как во втором после.. выделяешь отдельный массив, потом а туда копаешь, потом б, только уже со смещение а

добавить не скопировать, лол!

memcat вроде есть, но массив должен быть заведомо больше..
можешь как во втором после.. выделяешь отдельный массив, потом а туда копаешь, потом б, только уже со смещение а

не извращайся над русским языкам извращениц.
Надо писать не лол а лох но если ты не умееш выговаривать слова то иди к логопеду.

Как клонировать объект или массив в JavaScript

Существует несколько способов клонировать объект или массив в JavaScript , чтобы ссылки на них отличались от ссылок на их исходные копии. Давайте рассмотрим несколько методов правильного клонирования объектов и массивов и также остановимся отдельно на лучшем способе копирования массива объектов.

Использование Array.from() и Object.assign()

Первый метод предназначен для клонирования массивов, а второй — объектов.

Такой вариант подходит для создания копий обычных (простых) массивов и объектов, но не для вложенных или многомерных.

Методы Object.assign() и Array.from() создают неглубокие копии. Вложенные массивы или объекты также не клонируются. Вместо этого создаются ссылки на их оригинал.

Клонировать объект или массив в JavaScript через спред (spread) оператор

Для копии массива или объекта можно использовать и spread оператор.

Тем не менее, это приводит к аналогичным проблемам, как и при применении методов Array.from() и Object.assign() , когда речь заходит о вложенных или многомерных массивах и объектах.

Применение JSON.stringify() и JSON.parse()

Один из наиболее что рекомендуемых способов решения проблемы копирования многомерных массивов и объектов — это структурировать их при помощи метода JSON.stringify() . Затем его необходимо преобразовать обратно методом JSON.parse() .

Несмотря на то, что это вполне рабочий вариант, у него есть и недостатки. Таким способом правильно клонируются только JSON -данные.

В качестве наглядного примера рассмотрим объект включающий объекты с несколькими типами данных. Мы клонируем его с помощью методов JSON.stringify() и JSON.parse() .

Массивы, объекты, строки, числа, логические значения и null скопировались без проблем.

Но конструктор new Date() , функции, регулярные выражения, методы Map() и Set() подверглись изменениям. Дата превратилась в строку, а остальные данные — в пустые объекты (<>) .

Если в исходном объекте или массиве используются только данные, которые являются валидными для JSON , то такой вариант копирования можно считать самым простым. В противном случае необходим иной подход.

Вспомогательная функция copy()

Чтобы клонировать объект или массив наиболее удобным способом можно создать вспомогательную функцию. Назовём её copy() . Она будет перебирать каждый элемент в массиве или объекте, создавать новый объект этого типа и помещает в него все элементы из исходника. Когда она сталкивается с вложенными итерируемыми элементами, то повторяет весь этот процесс и с ними.

Результатом её работы является точная копия оригинала.

Тестирование производительности

Здесь следует отметить тот факт, что сочетание методов JSON.stringify() и JSON.parse() работает почти в два раза быстрее, чем вспомогательная функция copy() .

Но это справедливо, когда речь заходит о небольших массивах и объектах, в том числе и с разными типами данных. Если же требуется создать копию действительно большого массива или объекта, то в этом случае copy() превосходит первый вариант по скорости почти в 3 раза.

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