Как очистить массив от нулей при помощи лямбда-выражений?
Есть, например, такой массив:
enum class T {A, B, C}; // Есть некое перечисление
using TI = map<T, int>; // Допустим его так можно заюзать в массиве
TI massive = {{A, 1}, {B, 0}, {C, 0}}
Как его можно очистить от нулей используя лямбда-выражение?
Чтобы вот это получилось: {{A, 1}}.
Например как-нибудь по типу такого:
std::vector<int> v{ 1, 0, 2, 0, 3, 0 };
v.erase(std::remove_if(v.begin(), v.end(),
[](auto& element){return element == 0;} ), v.end()
);
Ответы (3 шт):
Автор решения: Harry
→ Ссылка
Ну, если ну очень хочется лямбда-выражение - можно и его пришить, хотя проще без него:
enum class T {A, B, C};
using TI = map<T, int>;
TI massive = {{T::A, 1}, {T::B, 0}, {T::C, 0}};
int main(int argc, const char * argv[])
{
for(auto it = massive.begin(); it != massive.end(); )
{
bool kill = [](auto& elem){return elem.second == 0; }(*it);
if( kill )
it = massive.erase(it);
else
++it;
}
for(auto m: massive)
cout << m.second << endl;
}
Автор решения: dIm0n
→ Ссылка
Вот так вот:
#include <map>
#include <iostream>
enum class T {A, B, C};
using TI = std::map<T, int>;
TI massive = {{T::A, 1}, {T::B, 0}, {T::C, 0}};
int main() {
std::erase_if(massive, [](const auto& item) {
const auto&[k, v] = item;
return v == 0;
});
for (const auto&[k, v] : massive) {
std::cout << static_cast<int>(k) << ' ' << v << '\n';
}
}
Автор решения: Maggot
→ Ссылка
Я так понимаю мы вросто хотите дернуть лямбду - то наверное так
#include <cstdint>
#include <iostream>
#include <map>
#include <utility>
#include <ostream>
template<typename OS, typename T1, typename T2>
OS& operator<< (OS &out, const std::pair<T1, T2> &p) {
out << p.first << " " << p.second;
return out;
}
int main() {
std::map<uint64_t, uint64_t> m{{1, 1}, {2, 2}, {3, 0}, {4, 1}, {5, 0}};
for (auto& p : m) {
std::cout << p << "; ";
}
std::cout << std::endl;
auto f{[](std::map<uint64_t, uint64_t>& m, uint64_t val){std::erase_if(m, [=](const auto& item) {return item.second == val;});}};
f(m, 0);
for (auto& p : m) {
std::cout << p << "; ";
}
std::cout << std::endl;
return 0;
}