# Erase remove

## Назначение

Идиома Erase-remove относится к алгоритмической операции, которая используется для удаления элементов из контейнера на основе заданного критерия удаления, сохраняя порядок расположения элементов.

## Решаемые задачи

* Отсутствие смещения элементов, расположенных после удаленного элемента.

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

## Обащая реализация на языке C++

{% hint style="info" %}
Удаление происходит в два этапа:

1. Метод remove() перемещает все элементы, не удовлетворяющие условию, в начало контейнера, а затем возвращает итератор на элемент, следующий за последним перемещенным элементом.
2. Метод erase() удаляет элементы, начиная с указанного итератора до конца контейнера.
   {% endhint %}

{% code fullWidth="true" %}

```cpp
int main() {
    std::vector<int> vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    vec.erase(std::remove_if(vec.begin(), vec.end(), [](int x)
    {
        return x % 2 == 0; 
    }), vec.end());
}
```

{% endcode %}
