vector::erase в C++ (с примерами)

Здравствуйте! Сегодня мы обсудим часто используемую функцию в C++ для управления элементами в векторе - erase. Начнем с изучения этой функции, узнаем, как правильно ее использовать, и рассмотрим практические примеры. К концу статьи у вас будет твердое понимание этого важного инструмента.

Удаление элементов из вектора в C++

Векторы в C++ — это динамические массивы, которые могут увеличиваться и уменьшаться в размере. Иногда нам нужно удалить элементы из вектора, будь то один элемент или диапазон. Здесь на помощь приходит функция erase.

Функция erase выглядит так:

vector::erase(iterator position);
vector::erase(iterator first, iterator last);
  • Функция принимает итераторы первого и последнего удаляемых элементов.
  • Она возвращает итератор, указывающий на следующий элемент после удаленного (или удаленных). Если был удален последний элемент, итератор указывает на конец вектора.

Пример

Рассмотрим ее на примере простой программы:

#include <iostream>
#include <vector>

int main() {
  std::vector<int> my_vector;

  // Добавляем значения от 1 до 10
  for (int i=1; i<=10; i++) my_vector.push_back(i);

  // Удаляем 6-й элемент
  my_vector.erase(my_vector.begin()+5);

  // Удаляем первые 3 элемента
  my_vector.erase(my_vector.begin(),my_vector.begin()+3);

  std::cout << "my_vector содержит:";
  for (unsigned i=0; i<my_vector.size(); ++i)
    std::cout << ' ' << my_vector[i];
  std::cout << '\n';

  return 0;
}

Выходные данные программы:

my_vector содержит: 4 5 7 8 9 10

Важные моменты

Когда вы удаляете элемент (или несколько элементов) из вектора:

  1. Размер вектора уменьшается на количество удаленных элементов.
  2. Если вы не удаляете элементы с конца, вектор сдвигает все элементы после удаленных на новые позиции. Это не так быстро, как в некоторых других контейнерах, таких как list или forward_list.

Сложность

Время выполнения зависит от двух вещей: количества удаляемых элементов и количества элементов после удаляемых. Последние перемещаются на новые позиции.

Итераторы

Будьте осторожны с вашими итераторами! Если они указывают на удаленный элемент или на любой элемент после него, они будут работать не так, как вы ожидаете. Но итераторы до удаленных элементов остаются действительными.

Безопасность и исключения

Используя erase, вы изменяете вектор. Но элементы до удаленных не затрагиваются. Так что безопасно обращаться или изменять их при использовании erase. Если вы ошибочно передаете неправильную позицию или диапазон в erase, результат может быть непредсказуемым, будьте внимательны.

Связанные функции

Так же, как функция erase помогает управлять элементами в векторе, C++ предлагает множество других утилит для различных контейнеров. Например, если вы хотите вставить элементы на определенную позицию в векторе, вы можете использовать функцию vector::insert. Если же вы хотите удалить последний элемент из вектора, вы можете использовать функцию vector::pop_back. Продолжая изучать C++, вы будете углублять свое понимание возможностей языка.

Упражнения

  1. Основы erase:
    Напишите программу на C++, которая:

    • Создает вектор строк с названиями пяти ваших любимых фильмов.
    • Просит пользователя ввести название фильма для удаления из вектора.
    • Использует функцию erase для удаления фильма, если он есть в векторе.
    • Затем отображает оставшиеся фильмы в векторе.
  2. Понимание итераторов и erase:
    Измените предыдущую программу, чтобы попробовать удалить фильм на основе его индекса (позиции) в векторе.

    • После удаления фильма попробуйте обратиться к итератору, указывающему на элемент после удаленного. Что произойдет? Добавьте комментарии в ваш код, объясняя свои наблюдения.
    • Также отобразите фильм на позиции удаленного элемента после использования erase. (Помните, что функция возвращает итератор, указывающий на следующий элемент после удаленного.)
  3. Сравнение производительности с list или forward_list:
    Используя свои знания из статьи и других источников:

    • Напишите программу, которая создает большой вектор и большой список (например, содержащие 100 000 целых чисел).
    • Удалите элементы из середины и вектора, и списка, и измерьте время, необходимое для каждой операции.
    • Отобразите время и напишите короткий анализ (1-2 абзаца) о том, какой контейнер быстрее для этого типа операций и почему.

Обсуждение