翻转地图键值对

Ric*_*ard 10 c++ map flip

我有一张地图.我想翻转键值,以便它不会成为地图.所以基本上第一张地图的价值成为第二张地图的关键.我该怎么做呢?

示例地图:

1 - 1.0
2 - 2.0
Run Code Online (Sandbox Code Playgroud)

翻转后

1.0 - 1
2.0 - 2
Run Code Online (Sandbox Code Playgroud)

Set*_*gie 9

最直接的方式(我知道)是创建一个翻转类型的新地图,并迭代旧的地图并反向添加每个键值对.

例如,

map<int, float> if_map;

// insert some items into if_map
if_map[1] = 43.11;
if_map[44] = -13421.438;

map<float, int> reversed;

for (map<int, float>::iterator i = if_map.begin(); i != if_map.end(); ++i)
    reversed[i->second] = i->first;
Run Code Online (Sandbox Code Playgroud)

  • 或者,将生成的翻转地图存储在std :: multimap中. (6认同)
  • 如果原始映射是一对一的,则此答案有效.如果没有,此代码将导致一些信息丢失.要解决此问题,请使用[Boost.bimap](http://www.boost.org/doc/libs/1_42_0/libs/bimap/doc/html/index.html)作为[@Asha](http:/ /stackoverflow.com/users/392315/asha) [建议](http://stackoverflow.com/a/8321400/377657),或将结果作为`vector <pair>`返回. (4认同)

Kri*_*rma 9

#include<iostream>
#include<map>
#include<algorithm>

using namespace std;

template<typename A, typename B>
pair<B,A> flip_pair(const pair<A,B> &p)
{
    return pair<B,A>(p.second, p.first);
}

template<typename A, typename B>
map<B,A> flip_map(const map<A,B> &src)
{
    map<B,A> dst;
    transform(src.begin(), src.end(), inserter(dst, dst.begin()), 
                   flip_pair<A,B>);
    return dst;
}

int main(void)
{
  std::map<char, int> src;

  src['a'] = 10;
  src['b'] = 20;
  src['c'] = 160;
  src['d'] = 110;
  src['e'] = 0;

  std::map<int, char> dst = flip_map(src);

  map<int, char>::iterator it;
  for(it=dst.begin(); it!=dst.end(); it++) {
    cout << it->first << " : " << it->second << endl;
  }
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*ley 5

for (auto i=normal.begin(); i!=normal.end(); ++i)
    flipped[i->second] = i->first;
Run Code Online (Sandbox Code Playgroud)