如果我有静态map<K, V> m{{"m1", 1}, {"m2", 2}, ...}
这是使用相同对将其转换为map<V, K>
的最简单方法,但现在值转到键和值的键?
我希望在类初始化代码中有这个。像那样:
class PseudoEnum{
enum Enum{m1, m2, m3};
static map<string, Enum> _strMapping = {{"m1", Enum::m1}, {"m2", Enum::m2}, ...};
static map<Enum, string> _enumMapping = ??? // shortest possible init
}
答案 0 :(得分:6)
std::transform(m.cbegin(), m.cend(), std::inserter(other, other.begin()),
[](auto const& p){
return std::make_pair(p.second, p.first);
});
这应该足够了。你可以将它包装在一个函数中:
template<typename K, typename V>
auto invert_mapping(std::map<K,V> const& m)
{
std::map<V,K> other;
std::transform(m.cbegin(), m.cend(), std::inserter(other, other.begin()),
[](auto const& p){
return std::make_pair(p.second, p.first);
});
return other;
}
然后你会打电话给
static map<Enum, string> _enumMapping = invert_mapping(_strMapping);
如果要在原地初始化它,可以使用Boost的变换迭代器:
auto tr = [](auto const& p){ return std::make_pair(p.second, p.first); };
std::map<Enum, std::string> _enumMapping(
boost::make_transform_iterator(_strMapping.cbegin(), tr),
boost::make_transform_iterator(_strMapping.cend(), tr)
);