Удаление элементов
Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 16 из 56.
Иногда вам нужно удалять элементы из вектора, когда они больше не нужны. Векторы требуют использования итератора с методом .erase(). Вы можете комбинировать std::find() с .erase() для удаления элементов по значению.
Вот как удалить элемент из вектора:
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
numbers.erase(it); // Удаляет элемент в позиции итератора
}После вызова erase(), элемент в этой позиции удаляется, а все последующие элементы сдвигаются вниз. Если вы попытаетесь найти и удалить элемент, который не существует, find() вернет end(), и проверка этого условия предотвращает ошибки.
Этот паттерн делает удаление элементов безопасным и предсказуемым. Он особенно полезен для управления динамическими коллекциями, когда необходимо удалять определенные элементы на основе пользовательского ввода или логики программы. Не забывайте всегда проверять валидность итератора перед удалением.
Задание
ЛегкоСоздайте программу, которая демонстрирует удаление элементов из std::vector с использованием метода .erase() в сочетании с std::find(). Эта задача проверит ваше понимание того, как безопасно удалять определенные элементы из вектора и наблюдать за результатами.
Будут предоставлены следующие входные данные:
- Целое число
n, представляющее количество элементов, которые изначально нужно добавить в вектор - Затем
nцелых чисел для вставки в вектор - Целое число
m, представляющее количество элементов для удаления - Затем
mцелых чисел, представляющих элементы, которые необходимо удалить из вектора
Ваша программа должна:
- Создать пустой
std::vector<int> - Считать количество добавляемых элементов и вставить их в вектор с помощью
.push_back() - Вывести начальный размер вектора после всех вставок
- Считать количество элементов для удаления
- Для каждого удаляемого элемента использовать
std::find(), чтобы найти его, а затем использовать.erase()для его удаления, если он найден - После каждой попытки удаления выводить текущий размер вектора
- В конце перебрать оставшиеся элементы в векторе и вывести их по порядку
Используйте следующий точный формат вывода:
Начальный размер вектора:
Initial size: [size]После каждой попытки удаления:
After removing [number]: size = [current_size]Финальные оставшиеся элементы:
Remaining elements: [element1] [element2] [element3] ...Помните, что .erase() требует итератор, поэтому вы должны сначала использовать std::find(), чтобы найти элемент. Всегда проверяйте, был ли элемент найден, прежде чем удалять его. Используйте цикл for на основе диапазона (range-based for loop), чтобы вывести оставшиеся элементы в их текущем порядке.
Шпаргалка
Используйте std::find() в сочетании с .erase() для удаления конкретного элемента из вектора:
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
numbers.erase(it); // Удаляет элемент в позиции итератора
}Всегда проверяйте, не равен ли итератор end() перед удалением, чтобы избежать неопределенного поведения. Метод .erase() требует итератор, а не само значение напрямую.
Попробуйте сами
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// Считать количество элементов для добавления
int n;
cin >> n;
// Создать пустой вектор
vector<int> myVector;
// Считать и вставить n элементов
for (int i = 0; i < n; i++) {
int element;
cin >> element;
// Вставить элемент в вектор
}
// Считать количество элементов для удаления
int m;
cin >> m;
// TODO: Напишите свой код ниже
// 1. Вывести начальный размер вектора
// 2. Для каждого удаляемого элемента найти его, использовать .erase() и выводить размер после каждого удаления
// 3. Вывести оставшиеся элементы в векторе
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров