Menu
CoddyTech

Удаление элементов

Часть раздела Логика и управление потоком путешествия по C++ на Coddy. Урок 16 из 56.

Иногда нужно удалять элементы из вектора, когда они больше не нужны. Для этого векторы требуют использовать итератор с методом .erase(). Можно объединить std::find() с .erase(), чтобы удалять элементы по значению.

Вот как удалить элемент из вектора. std::find() находится в заголовочном файле <algorithm>, поэтому подключите его вместе с <vector>:

#include <algorithm>
#include <vector>
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(), и проверка этого предотвратит ошибки.

Этот шаблон делает удаление элементов безопасным и предсказуемым. Он особенно полезен при работе с динамическими коллекциями, из которых нужно удалять определённые элементы в зависимости от ввода пользователя или логики программы. Не забывай всегда проверять, действителен ли итератор, прежде чем удалять элемент.

challenge icon

Задание

Легко

Создай программу, которая демонстрирует удаление элементов из std::vector с помощью метода .erase() в сочетании с std::find(). Это задание проверит, понимаешь ли ты, как безопасно удалять определённые элементы из вектора и наблюдать за результатами.

Будут предоставлены следующие входные данные:

  • Целое число n, представляющее количество элементов, которые нужно изначально добавить в вектор
  • Затем n целых чисел для добавления в вектор
  • Целое число m, представляющее количество элементов для удаления
  • Затем m целых чисел, представляющих элементы для удаления из вектора

Твоя программа должна:

  1. Создать пустой std::vector<int>
  2. Считать количество элементов для добавления и вставить их в вектор с помощью .push_back()
  3. Вывести исходный размер вектора после добавления всех элементов
  4. Считать количество элементов для удаления
  5. Для каждого элемента, который нужно удалить, использовать std::find(), чтобы найти его, а затем использовать .erase(), чтобы удалить его, если он найден
  6. После каждой попытки удаления вывести текущий размер вектора
  7. Наконец, перебрать оставшиеся элементы вектора и вывести их по порядку

Используй следующий точный формат вывода:

Исходный размер вектора:

Initial size: [size]

После каждой попытки удаления:

After removing [number]: size = [current_size]

Оставшиеся элементы:

Remaining elements: [element1] [element2] [element3] ...

Помни, что для .erase() требуется итератор, поэтому сначала нужно использовать std::find(), чтобы найти элемент. Всегда проверяй, найден ли элемент, прежде чем удалять его. Используй цикл for с диапазоном, чтобы вывести оставшиеся элементы в их текущем порядке.

Попробуйте сами

#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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор C++