Для вставки элемента на место 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 и будет опять проверяться на следующей итерации цикла, и опять сдвинется вправо.
|