§ 14. Пераўтварэнне элементаў масіву

14.5. Выдаленне элемента з масіву

Для выдалення з масіву элемента, які стаіць на месцы k, трэба зрушыць на адну пазіцыю ўлева ўсе элементы, якія стаяць пасля яго. Колькасць элементаў пры гэтым памяншаецца на 1. Гэтыя дзеянні рэалізаваны ў функцыі erase, якая належыць класу vector. Даступныя два варыянты выкліку гэтай функцыі:

erase(pos)

Выдаляе адзін элемент

erase(first, last)

Выдаляе элементы ў дыяпазоне [first; last)

Параметрамі функцыі erase з’яўляюцца ітэратары. Калі трэба выдаліць, напрыклад, пяты элемент, то параметр функцыі можа быць запісаны так: a.begin() + 5.

Прыклад 14.7. Зададзены аднамерны масіў цэлых лікаў. Выдаліць з яго ўсе лікі, кратныя 5. Колькі лікаў выдалілі?

Этапы выканання задання

I. Зыходныя даныя: аднамерны масіў а, колькасць элементаў n.

II. Вынік: пераўтвораны масіў a і колькасць выдаленых лікаў k.

III. Алгарытм рашэння задачы.

1. Увод зыходных даных. 
2. Будзем паслядоўна праглядаць элементы масіву. Калі знойдзем лік, кратны 5, то выдалім яго з масіву, выкарыстоўваючы функцыю erase. Паколькі колькасць выдаляемых элементаў загадзя невядомая, то выкарыстаем цыкл while
3. Пры выдаленні элемента лічыльнік k будзем павялічваць на 1. 
4. Вывад выніку.

IV. Апісанне пераменных: n, k – int, а – vector <int>.

Паколькі элементы пры выдаленні зрушваюцца ўлева, абыходзіць масіў можна з канца (прыклад 14.8).

Прыклад 14.7.

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 i = 0, k = 0;

  while (< a.size()){

    if (a[i] % 5 == 0){

      a.erase(a.begin() + i);

      k++;

    }

    else

      i++;

  }

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

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

  cout << endl << "udalili ";

  cout << k << " elementov" << endl;

  return 0;

}

VI. Тэсціраванне.

VII. Аналіз вынікаў. Элементы 5, 15, 35, 10 і 30 кратныя 5, таму іх выдалілі з масіву. Элементы 3 і 4 не кратныя 5, таму яны засталіся ў масіве і зрушыліся ў пачатак.

Прыклад 14.8. Фрагмент праграмы:

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

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

    a.erase(a.begin() + i);

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

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

cout << endl << "udalili ";

cout << n - a.size();

cout << " elementov" << endl;

Лічыльнік k можна не выкарыстоўваць, колькасць выдаленых элементаў можна знайсці як рознасць паміж пачатковай колькасцю элементаў n і даўжынёй вектара пасля выдалення элементаў:

n – a.size().