§ 14. Преобразование элементов массива

14.6. Вставка элемента в массив

Для вставки элемента на место k необходимо освободить это место в массиве. Для этого нужно сдвинуть на одну позицию вправо все элементы массива, стоящие после k - 1. Сдвиг начинаем с последнего элемента. Количество элементов в массиве увеличиться на 1. Эти действия реализованы в функции insert. Имеются следующие возможности вызова функции insert:

insert(pos, value)

Вставляет value перед элементом, на который указывает pos

insert(pos, value, count)

Вставляет count копий значения value перед элементом, на который указывает pos

insert(pos, first, last)

Вставляет элементы из диапазона [first, last) перед элементом, на который указывает pos

Параметры pos, first, last являются итераторами.

Пример 14.9. Задан массив целых чисел. Вставить число x на k-е место, если элемент a[k] кратен x.

Этапы выполнения задания

I. Исходные данные: одномерный массив а, количество элементов n, число, которое нужно вставить в массив x.

II. Результат: преобразованный массив a.

III. Алгоритм решения задачи.

1. Ввод исходных данных. 
2. В цикле проверяем элементы массива. 
3.  Если текущий элемент кратен x, то вставляем число x в массив. 
4. Вывод результата.

IV. Описание переменных: n, x – int, а – vector <int>.

Пример 14.9.

V. Программа:

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

  int n;

  cout << "n = ";

  cin >> n;

  vector <int> a(n);

  for (int i = 0; i < n; i++)

    cin >> a[i];

  int x;

  cout << "x = ";

  cin >> x;

  for (int i = n - 1; i >= 0; i--)

    if (a[i] % x == 0)

      a.insert(a.begin() + i, x);

  for (int i = 0; i < a.size(); i++)

    cout << a[i] << " ";

  cout << endl;

  return 0;

}

VI. Тестирование.

VI. Анализ результатов. Число 5 вставлено перед значениями 10, 15, 30, 20, 45.

В программе используется обход массива с конца. Если в программе записать такой цикл:

for (int i = 0; i < a.size(); i++)

  if (a[i] % x == 0)

    a.insert(a.begin() + i, x);

то программа может зациклиться. Например, на нулевом месте стоит число 10, удовлетворяющее условию задачи. На его место вставили число 5. Число 10 сдвинулось на позицию 1 и будет опять проверяться на следующей итерации цикла, и опять сдвинется вправо.