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

Nat*_*sha 1 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  
}
Run Code Online (Sandbox Code Playgroud)

krz*_*zaq 6

std::transform(m.cbegin(), m.cend(), std::inserter(other, other.begin()),
               [](auto const& p){
    return std::make_pair(p.second, p.first);
});
Run Code Online (Sandbox Code Playgroud)

这应该足够了.你可以将它包装在一个函数中:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后你会打电话

static map<Enum, string> _enumMapping = invert_mapping(_strMapping);
Run Code Online (Sandbox Code Playgroud)

如果要在原位初始化它,可以使用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)
);
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢术语`invert_mapping`到`reverse_key_value`.这与数学中的[逆映射](https://en.wikipedia.org/wiki/Inverse_function)有关. (2认同)