Как очистить массив от нулей при помощи лямбда-выражений?

Есть, например, такой массив:

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;
}
→ Ссылка