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
Важные моменты
Когда вы удаляете элемент (или несколько элементов) из вектора:
- Размер вектора уменьшается на количество удаленных элементов.
- Если вы не удаляете элементы с конца, вектор сдвигает все элементы после удаленных на новые позиции. Это не так быстро, как в некоторых других контейнерах, таких как
list
илиforward_list
.
Сложность
Время выполнения зависит от двух вещей: количества удаляемых элементов и количества элементов после удаляемых. Последние перемещаются на новые позиции.
Итераторы
Будьте осторожны с вашими итераторами! Если они указывают на удаленный элемент или на любой элемент после него, они будут работать не так, как вы ожидаете. Но итераторы до удаленных элементов остаются действительными.
Безопасность и исключения
Используя erase
, вы изменяете вектор. Но элементы до удаленных не затрагиваются. Так что безопасно обращаться или изменять их при использовании erase
. Если вы ошибочно передаете неправильную позицию или диапазон в erase
, результат может быть непредсказуемым, будьте внимательны.
Связанные функции
Так же, как функция erase
помогает управлять элементами в векторе, C++ предлагает множество других утилит для различных контейнеров. Например, если вы хотите вставить элементы на определенную позицию в векторе, вы можете использовать функцию vector::insert
. Если же вы хотите удалить последний элемент из вектора, вы можете использовать функцию vector::pop_back
. Продолжая изучать C++, вы будете углублять свое понимание возможностей языка.
Упражнения
-
Основы
erase
:
Напишите программу на C++, которая:- Создает вектор строк с названиями пяти ваших любимых фильмов.
- Просит пользователя ввести название фильма для удаления из вектора.
- Использует функцию
erase
для удаления фильма, если он есть в векторе. - Затем отображает оставшиеся фильмы в векторе.
-
Понимание итераторов и
erase
:
Измените предыдущую программу, чтобы попробовать удалить фильм на основе его индекса (позиции) в векторе.- После удаления фильма попробуйте обратиться к итератору, указывающему на элемент после удаленного. Что произойдет? Добавьте комментарии в ваш код, объясняя свои наблюдения.
- Также отобразите фильм на позиции удаленного элемента после использования
erase
. (Помните, что функция возвращает итератор, указывающий на следующий элемент после удаленного.)
-
Сравнение производительности с
list
илиforward_list
:
Используя свои знания из статьи и других источников:- Напишите программу, которая создает большой вектор и большой список (например, содержащие 100 000 целых чисел).
- Удалите элементы из середины и вектора, и списка, и измерьте время, необходимое для каждой операции.
- Отобразите время и напишите короткий анализ (1-2 абзаца) о том, какой контейнер быстрее для этого типа операций и почему.
Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение