C++ для начинающих Массивы Склеить два одномерных в один

Иногда возникает вопрос склейки двух массивов в один. В этой теме я покажу такую склейку.
В C++ напрямую приклеить значения одного массива к значениями массива другого — нельзя. Нужно создавать новый массив, ёмкость которого позволила бы уместить все элементы склеиваемых массивов.
Начнём с самого обычного способа, подходящего абсолютным новичкам:

Такая склейка массивов требует очень много памяти. Если массивы большие, то существует возможность просто не создать третий массив, потому что в памяти может не быть столько свободного места, требуется для содержания трёх массивов (N1+N2)*2 ячеек, где N1 и N2 — это количество ячеек первого и второго массивов.
Использование тернарной операции может помочь чуть-чуть сократить показанный код:

Похожий способ заполнения, с той же прожорливостью памяти, реализуется с помощью memmove, это уже язык С, но тем не менее я покажу, как:

Пока что объясню моменты, в которых могли бы возникнуть вопросы.
memmove — это функция из языка С. Для её использования нужно инклюдить <string.h>. В неё, в функцию, нужно закинуть заполняемый массив, массив, которым заполняется заполняемый массив, и сколько ячеек нужно заполнить. Количество заполняемых ячеек рассчитывается по формуле {Размер ячейки * Количество ячеек в массиве}, т. е. {sizeof(arr[0]) * N}. А поскольку в заполняемом массиве как бы две точки начал массивов: начало первого массива и начало второго, то нужно эти начала разделять, из-за чего сначала я написал +0 (для наглядности), а потом +N1 (N1 ячеек было заполнено, поэтому при дальнейшем заполнении массива arr3 эти N1 ячеек перескакиваются).
Сейчас речь пойдёт для продвинутых новичков. В С++ существует возможность склеивать массивы таким образом, чтобы память расходовалаь экономней, чем она расходуется при создании нового массива и его заполнения из двух существующих. Вместо того, чтобы использовать три массива, можно использовать классы:

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

Наиболее практичное решение именно с использованием алгоритма insert, но в учебных целях вам может понадобиться любой из показанных способов.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

Один комментарий: C++ для начинающих Массивы Склеить два одномерных в один

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

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/sergey-teplyakov-5578089/patterny-proektirovaniya-na-platforme-net/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор рекурсии

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок