У меня есть 2 массива с плавающей точкой. С клавиатуры читается переменная K Я должен вставить в 1-й массив элементы 2-го массива после значения K. Пример:
массив 1 (7 элементов): 1, 2, 3, 4, 5, 6, 7
массив 2 (3 элемента): 9, 10, 11
Допустим, К = 4
массив 1 становится: 1, 2, 3, 4, 9, 10, 11, 5, 6, 7 (по K элементов за раз из каждого массива)
Как бы я переместил элементы вправо (в массиве 1), чтобы вставить элементы массива 2 (и повторить процесс)? Я бы предпочел избегать использования любых функций массива C ++ 11 (преобразование, сортировка и т. Д.)
Поскольку это звучит как домашняя работа, я лишь дам вам несколько советов по поводу решения, без полного кода.
Разделите задачу на две подзадачи: перемещение элементов в первом массиве вправо на некоторое смещение (количество вставляемых элементов, т.е. длина второго списка) и перемещение элементов из второго массива в первый массив где вы только что удалили элементы. Не делайте повторите эту процедуру для каждого элемента, который вы вставляете, но лучше переместите элементы на (уже известный) размер второго массива. Это должно быть быстрее, чем вы описали.
Чтобы избежать необходимости во временной копии (чтобы она могла быть «на месте», и в своих комментариях вы сказали, что вам не разрешено выделять третий (временный) массив), вы должны начинать перемещение элементов с конца. Это гарантирует, что вы не будете перезаписывать значения, которые вам позже понадобятся, что будет иметь место, если вы начнете перемещать элементы слева.
Допустим, часть, которая будет перемещена в первом массиве, начинается с некоторого индекса start
(в вашем вопросе это K
Я думаю) и весь массив имеет длину end
(Т.е. end
является индексом элемента «один за концом»).
Напишите цикл, который перебирает источник индексы (т.е. где вы читать старые значения) в вашем первом массиве. Переместите их по смещению в вашем первом массиве. Обратите внимание, что этот цикл, как объяснено выше, повторяется назад, то есть вам нужно что-то вроде for (int index = end-1; index >= start; --index)
, Этот цикл начинается с последнего элемента (end-1
; Обратите внимание, что end
это длина и, следовательно, очки после массив) и заканчивается (включительно) в start
,
Переместив элементы вправо, вы можете начать перемещение элементов из второго массива в первый. Здесь порядок не имеет значения, поэтому я бы предпочел итерацию вперед для простоты.
Как обсуждается ниже в этом ответе, я предполагаю, что в массиве 1 уже выделено достаточно места. Пожалуйста, убедитесь, что это так в вашем коде. Поскольку вам не разрешено выделять третий массив, другой опции нет, кроме этой. (Если вам не разрешено использовать автоматическое распределение в виде структур данных динамического размера, таких как std::vector
)
Мой ответ может не совсем ответить на ваш вопрос. Но так как вы используете c ++, а не c, вы должны использовать векторы, а не массивы.
vector<int> vec1{1, 2, 3, 4, 5, 6, 7};
vector<int> vec2{9, 10, 11};
vec1.insert(vec1.begin()+k,vec2.begin(),vec2.end());
Этого достаточно для всех ваших нужд;