Скопировать один динамический массив в другой
Первый массив я наполняю содержимым и мне нужно потом его скопировать во второй массив. Подскажите как это сделать быстрее всего и с меньшим количеством кода, без цикла. Спасибо.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Скопировать динамический массив в другой массив только с положительными элементами из первого
Пользователь вводит размер массива и сам массив. Программа копирует в другой массив только.
Скопировать один символьный массив в другой
Привет всем, многоуважаемые пользователи не могу сделать программу. Нам даны два массива s1 и s2.
Скопировать один массив char в другой
у меня двухмерный символьный и одномерный массивы символов. Что в общем то мне нужно. После.
Скопировать один массив в другой, используя указатели
всем привет. простейшая задачка на копирование массива при помощи указателей. все работает, но.
Как скопировать динамический массив c
Кроме отдельных динамических объектов в языке C++ мы можем использовать динамические массивы. Для выделения памяти под динамический массив также используется оператор new , после которого в квадратных скобках указывается, сколько массив будет содержать объектов:
int *numbers ; // динамический массив из 4 чисел // или так // int *numbers = new int[4];
Причем в этом случае оператор new также возвращает указатель на объект типа int — первый элемент в созданном массиве.
В данном случае определяется массив из четырех элементов типа int, но каждый из них имеет неопределенное значение. Однако мы также можем инициализировать массив значениями:
int *numbers1 >; // массив состоит из чисел 0, 0, 0, 0 int *numbers2 >; // массив состоит из чисел 1, 2, 3, 4 int *numbers3 >; // массив состоит из чисел 1, 2, 0, 0 // аналогичные определения массивов // int *numbers1 = new int[4]<>; // массив состоит из чисел 0, 0, 0, 0 // int *numbers1 = new int[4](); // массив состоит из чисел 0, 0, 0, 0 // int *numbers2 = new int[4]< 1, 2, 3, 4 >; // массив состоит из чисел 1, 2, 3, 4 // int *numbers3 = new int[4]< 1, 2 >; // массив состоит из чисел 1, 2, 0, 0
При инициализации массива конкретными значениями следует учитывать, что если значений в фигурных скобках больше чем длина массива, то оператор new потерпит неудачу и не сможет создать массив. Если переданных значений, наоборот, меньше, то элементы, для которых не предоставлены значения, инициализируются значением по умолчанию.
Стоит отметить, что в стандарт С++20 добавлена возможность выведения размера массива, поэтому, если применяется стандарт С++20, то можно не указывать длину массива:
int *numbers >; // массив состоит из чисел 1, 2, 3, 4
После создания динамического массива мы сможем с ним работать по полученному указателю, получать и изменять его элементы:
int *numbers >; // получение элементов через синтаксис массивов std::coutПричем для доступа к элементам динамического массива можно использовать как синтаксис массивов ( numbers[0] ), так и операцию разыменования ( *numbers )
Соответственно для перебора такого массива можно использовать различные способы:
unsigned n< 5 >; // размер массива int* p < new int[n] < 1, 2, 3, 4, 5 >>; // используем индексы for (unsigned i<>; i < n; i++) < std::cout std::cout ; i < n; i++) < std::cout std::cout ; q != p + n; q++) < std::cout std::coutОбратите внимание, что для задания размера динамического массива мы можем применять обычную переменную, а не константу, как в случае со стандартными массивами.
Для удаления динамического массива и освобождения его памяти применяется специальная форма оператора delete :
delete [] указатель_на_динамический_массив;#include int main() < unsigned n< 5 >; // размер массива int* p < new int[n] < 1, 2, 3, 4, 5 >>; // используем индексы for (unsigned i<>; i < n; i++) < std::cout std::cout
Чтобы после освобождения памяти указатель не хранил старый адрес, также рекомендуется обнулить его:
delete [] p; p = nullptr; // обнуляем указательМногомерные массивы
Также мы можем создавать многомерные динамические массивы. Рассмотрим на примере двухмерных массивов. Что такое по сути двухмерный массив? Это набор массив массивов. Соответственно, чтобы создать динамический двухмерный массив, нам надо создать общий динамический массив указателей, а затем его элементы - вложенные динамические массивы. В общем случае это выглядит так:
#include int main() < unsigned rows = 3; // количество строк unsigned columns = 2; // количество столбцов int** numbers>; // выделяем память под двухмерный массив // выделяем память для вложенных массивов for (unsigned i<>; i < rows; i++) < numbers[i] = new int[columns]<>; > // удаление массивов for (unsigned i<>; i < rows; i++) < delete[] numbers[i]; >delete[] numbers; >Вначале выделяем память для массива указателей (условно таблицы):
int** numbers>;Затем в цикле выделяем память для каждого отдельного массива (условно строки таблицы):
numbers[i] = new int[columns]<>;Освобождение памяти идет в обратном порядке - сначала освобождаем память для каждого отдельного вложенного массива, а затем для всего массива указателей.
Пример с вводом и выводом данных двухмерного динамического массива:
#include int main() < unsigned rows = 3; // количество строк unsigned columns = 2; // количество столбцов int** numbers>; // выделяем память под двухмерный массив for (unsigned i<>; i < rows; i++) < numbers[i] = new int[columns]<>; > // вводим данные для таблицы rows x columns for (unsigned i<>; i < rows; i++) < std::cout ; j < columns; j++) < std::cout > numbers[i][j]; > > // вывод данных for (unsigned i<>; i < rows; i++) < // выводим данные столбцов i-й строки for (unsigned j<>; j < columns; j++) < std::cout std::cout for (unsigned i<>; i < rows; i++) < delete[] numbers[i]; >delete[] numbers; >Пример работы программы:
Enter data for 1 row 1 column: 2 2 column: 3 Enter data for 2 row 1 column: 4 2 column: 5 Enter data for 3 row 1 column: 6 2 column: 7 2 3 4 5 6 7Указатель на массив
От типа int** , который представляет указатель на указатель (pointer-to-pointer) следует отличать ситуацию "указатель на массив" (pointer to array). Например:
#include int main() < unsigned n; // количество строк int (*a)[2] = new int[n][2]; int k<>; // устанавливаем значения for (unsigned i<>; i < n; i++) < // устанавливаем данные для столбцов i-й строки for (unsigned j<>; j < 2; j++) < a[i][j] = ++k; >> // вывод данных for (unsigned i<>; i < n; i++) < // выводим данные столбцов i-й строки for (unsigned j<>; j < 2; j++) < std::cout std::cout // удаляем данные delete[] a; a = nullptr; >Здесь запись int (*a)[2] представляет указатель на массив из двух элементов типа int. Фактически мы можем работать с этим объектом как с двухмерным массивом (таблицей), только количество столбцов в данном случае фиксировано - 2. И память для такого массива выделяется один раз:
int (*a)[2] = new int[n][2];То есть в данном случае мы имеем дело с таблице из n строк и 2 столцов. Используя два индекса (для строки и столца), можно обращаться к определенному элементу, установить или получить его значение. Консольный вывод данной программы:
1 2 3 4 5 6Скопировать динамический массив в другой массив только с положительными элементами из первого
Пользователь вводит размер массива и сам массив. Программа копирует
в другой массив только положительные элементы из первого. Оба массива -
динамические. Работать с массивами - через указатели.94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:Скопировать один динамический массив в другой
Доброго времени суток. int *Array = new int; int *B_Array = new int; Первый массив я наполняю.
Динамический массив при наследовании, элементами которого являются объекты класса наследника динамический массив
Попробовал создать динамический массив, у которого элементы - объекты класса динамический массив.
Массив: найти номера столбцов с положительными элементами и записать их в одномерный массив
ввести двумерный массив I . найти номера столбцов с положительными элементами и записать их в.
Динамический массив ,элементами которого являются объекты класса динамический массив
Доброго времени суток, захотел создать динамический массив ,элементами которого являются объекты.21 / 21 / 26
Регистрация: 17.03.2015
Сообщений: 1191 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51#include #include #include #include #include int main() { int nMatrixOrder = 0; setlocale(LC_ALL, "russian"); std::cout "Введите размер мервого массива\n"; int nArraySize = 0; std::cin >> nArraySize; int *pArray = new int[nArraySize]; int nPositiveElementsCount = 0; std::cout "Исходный массив\n"; for (int i = 0; i nArraySize; i++) { pArray[i] = std::rand() % 10 - 1; std::cout std::to_string(pArray[i]) + " "; if (pArray[i] >= 0) ++nPositiveElementsCount; } std::cout std::endl; int *pSortedArray = new int[nPositiveElementsCount]; int nSortedArrayIndex = 0; for (int i = 0; i nArraySize; i++) { if (pArray[i] >= 0) pSortedArray[nSortedArrayIndex++] = pArray[i]; } std::cout "Отсортированный массив массив\n"; for (int i = 0; i nPositiveElementsCount; i++) std::cout std::to_string(pSortedArray[i]) + " "; std::cout std::endl; delete[] pArray; delete[] pSortedArray; system("pause"); return 0; }115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 484
Сообщение от Kosaer
Оба массива -
динамические. Работать с массивами - через указатели.
21 / 21 / 26
Регистрация: 17.03.2015
Сообщений: 119
RostikTawer, И? Конструкция вида a[i] есть ничто иное как *(a + i). Где здесь противоречие условию?
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 484
LaHaH, главное в моем ответе не динамические масивы, а
Сообщение от RostikTawer
Работать с массивами - через указатели.
21 / 21 / 26
Регистрация: 17.03.2015
Сообщений: 119RostikTawer, Тогда в следующий раз, вместе с цитатой, подписывайте о чем речь.
В любом случае, если решение не подходит - предложите свое.87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Дан двумерный массив, создать другой массив, строками которого будут диагонали первого массива
Дан двумерный массив , создать другой массив ,строками которого будут диагонали первого массива.
Динамический массив скопировать числа которые повторились 2 раза
Программа должна создать динамический массив из 20 случайных элементов из диапазона и вывести его.Из первого массива A скопировать в массив Б только те элементы, которые удовлетворяют зависимости
Дано два массива 4*4. Из первого массива A скопировать в массив Б только те элементы, которые.Как скопировать массив в динамический массив? (Си)
Есть массив char str[] = "abcdef"; И динамический массив: char *dstr = (char*)malloc(sizeof(char) * N); Как скопировать str[] в dstr[] ? P.S. Заранее извиняюсь, если вопрос глупый.
Отслеживать
задан 24 мая 2018 в 20:10
Denis Komarov Denis Komarov
53 1 1 серебряный знак 7 7 бронзовых знаков2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Есть 3 способа, нативное копирование области памяти, специальной функцией копирования строк, посимвольный перебор массива и запись в dstr .
memcpy(&str, &dstr, strlen(str) + 1); // Копирование области памятиstrcpy(dstr, str); // Специальная функция для строки// Перебор массива циклом. int strsize = strlen(str) + 1; for(int i = 0; iИмейте ввиду, в обоих случаях вы должны быть уверены что размер dstr больше на 1 чем длина строки str .
Отслеживать
Спасибо большое.
24 мая 2018 в 20:40Вместо i < strsize лучше использовать str[i] , тогда и длину считать не придётся. Кстати, в случае с длиной можно было использовать 24 мая 2018 в 21:44
Код содержит ошибки/странности! Если strsize = strlen(str) + 1 , то тогда правильная позиция для замыкающего нуля - это dstr[strsize - 1] , а не dstr[strsize] . Вы на самом деле уже скопировали этот ноль основным циклом. dstr[strsize] = '\0' уже делать не надо и позиция dstr[strsize] для нуля - неправильная.
24 мая 2018 в 22:21
@Qwertiy♦: Нолик и так уже "сам копируется" благодаря strsize = strlen(str) + 1 . А финальное dstr[strsize] = '\0' - это какая-то ненужная бессмыслица.
24 мая 2018 в 22:24
@Qwertiy Я бы в переборе не использовал strlen - по сути лишний проход по массиву. Достаточно int i; for(i = 0; str[i]; i++) dstr[i] = str[i]; dstr[i] = 0;
25 мая 2018 в 2:28
В данном случае (создание копии строки, не содержащей двоичных нулей) проще всего
(а если размер исходной строки не известен, то и не менее эффективно, чем использование malloc с последующими вызовами strlen , а затем strcpy или memcpy )
вызвать strdup#include . char str[] = "abcdef"; char *dstr = strdup(str);Конечно, возвращаемый указатель стоит проверить на NULL (аналогично использованию malloc ).

