как удалить элементы из массива

Нашел минимальный и максимальный элементы массива, теперь их нужно удалить. Из идей пока только отсортировать и "обрезать" массив, но хотелось бы знать как еще можно это сделать upd: массив небольшой и из целых цисел


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Сортировать не надо. Надо разделить все элементы на подходящие и не подходящие. Не подходящие вытесняются в конец массива, который затем отрезается - erase–remove idiom или erase_if в C++ 20. Для vector реализуется так:

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

int main() {
    std::vector<int> a = {9, 8, 7, -100, 6, 5, 4, 100, 3, 2, 1, 0};

    const int min = *min_element(a.begin(), a.end());
    const int max = *max_element(a.begin(), a.end());

    auto extremes = [min, max](int v) { return v == min || v == max; };

    // erase_if(a, extremes), если у вас C++ 20
    a.erase(remove_if(a.begin(), a.end(), extremes), a.end());

    for (int v : a) {
        std::cout << v << ' ';
    }
    std::cout << '\n';
}
$ g++ -std=c++17 -pedantic -Wall -Wextra -Werror temp.cpp && ./a.out
9 8 7 6 5 4 3 2 1 0

Обрезать массив таким образом не получится. Можно запомнить его длину после чистки:

#include <algorithm>
#include <iostream>

int main() {
    int a[] = {9, 8, 7, -100, 6, 5, 4, 100, 3, 2, 1, 0};

    const int min = *std::min_element(std::begin(a), std::end(a));
    const int max = *std::max_element(std::begin(a), std::end(a));

    auto extremes = [min, max](int v) { return v == min || v == max; };

    const auto garbage = std::remove_if(std::begin(a), std::end(a), extremes);

    for (auto it = std::begin(a); it != garbage; ++it) {
        std::cout << *it << ' ';
    }
    std::cout << '\n';
}
$ g++ -std=c++17 -pedantic -Wall -Wextra -Werror temp.cpp && ./a.out
9 8 7 6 5 4 3 2 1 0
→ Ссылка