§ 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. Зададзены масіў цэлых лікаў. Уставіць лік а 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 і будзе зноў правярацца на наступнай ітэрацыі цыкла, і зноў зрушыцца ўправа.