§ 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().