Что выведет код Middle Контейнеры STL изнутри обновлено

Что выведет: remove, erase и multiset

Вопрос

Что выведет программа (C++20, g++ 14)? Каждый вывод с новой строки, как в консоли.

#include <algorithm>
#include <iostream>
#include <set>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 3, 2, 4, 2};
    auto it = std::remove(v.begin(), v.end(), 2);
    std::cout << v.size() << ' ' << (it - v.begin()) << '\n';
    v.erase(it, v.end());
    for (int x : v) std::cout << x;
    std::cout << '\n';
    std::erase(v, 3);
    std::cout << v.size() << '\n';
    std::multiset<int> s{5, 5, 5, 7};
    s.erase(5);
    std::cout << s.size() << '\n';
}

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

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 6 3, 134, 2, 1. std::remove не меняет размер: он сдвигает оставшиеся элементы к началу и возвращает новый логический конец, поэтому размер 6, а оставшихся 3. erase отрезает хвост: 134. std::erase (C++20) удаляет тройку: размер 2. multiset::erase(5)…

Что выведет

6 3
134
2
1

Разбор

std::remove не меняет размер: он сдвигает оставшиеся элементы к началу и возвращает новый логический конец, поэтому размер 6, а оставшихся 3. erase отрезает хвост: 134. std::erase (C++20) удаляет тройку: размер 2. multiset::erase(5) удаляет все пятёрки, остаётся один элемент.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.