将map <key,value =“”>重建为map <value,key =“”>的最短/最简单方法

时间:2016-10-21 17:43:43

标签: c++ c++11 c++14

如果我有静态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  
}

1 个答案:

答案 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)
);