#include <iostream>
#include <list>
#include <map>
#include <string>
#include <type_traits>
#include <vector>
using namespace std;
int main() {
auto print = [](auto elements) {
for (const auto &iter : elements) {
if constexpr (is_same_v<map<int, string>, decltype(elements)>) {
cout << iter.first << " ";
} else {
cout << iter << " ";
}
}
cout << endl;
};
auto erase_test = [print]() {
vector<int> v = {1, 2, 3, 4, 5, 5, 6};
print(v);
cout << erase(v, 5) << endl;
print(v);
cout << endl;
list<int> l = {1, 2, 3, 4, 5, 5, 6};
print(l);
cout << erase(l, 5) << endl;
print(l);
};
erase_test();
cout << endl << "------" << endl << endl;
auto erase_if_test = [print]() {
vector<int> v = {1, 2, 3, 4, 5, 6};
print(v);
cout << erase_if(v, [](int i) { return i % 2 == 0; }) << endl;
print(v);
cout << endl;
map<int, string> m = {{1, "a"}, {2, "b"}, {3, "c"}};
print(m);
cout << erase_if(m, [](auto &item) {
auto &[key, value] = item;
return key % 2 == 0;
}) << endl;
print(m);
};
erase_if_test();
return 0;
}