#pragma once // https://ideone.com/k0H8Ei #include #include #include template struct map_adaptor { map_adaptor(const T& t, const F& f) : _t(t), _f(f) {} map_adaptor(map_adaptor& a) = delete; map_adaptor(map_adaptor&& a) = default; [[nodiscard]] auto begin() { return boost::make_transform_iterator(_t.begin(), _f); } [[nodiscard]] auto end() { return boost::make_transform_iterator(_t.end(), _f); } [[nodiscard]] auto cbegin() const { return boost::make_transform_iterator(_t.cbegin(), _f); } [[nodiscard]] auto cend() const { return boost::make_transform_iterator(_t.cend(), _f); } protected: const T& _t; F _f; }; template auto get_map_adaptor(const T& t, const F& f) { return map_adaptor(t, f); } template auto get_keys(const T& t) { return get_map_adaptor(t, [](const auto& p) { return p.first; }); } template auto get_values(const T& t) { return get_map_adaptor(t, [](const auto& p) { return p.second; }); }