как удалить элементы из массива
Нашел минимальный и максимальный элементы массива, теперь их нужно удалить. Из идей пока только отсортировать и "обрезать" массив, но хотелось бы знать как еще можно это сделать 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