将地图值交换为多图

Xar*_*lem 3 c++ containers

我用地图存储了一些键值,然后我需要按值对它们进行排序,我很想使用它:

#include <iostream>
#include <map>
#include <string>

int main ()
{
    std::map<std::string, int> map1;
    std::multimap<int, std::string> multimap2;

    map1.insert ( std::pair<std::string, int>( "one", 4) );
    map1.insert ( std::pair<std::string, int>( "two", 2) );
    map1.insert ( std::pair<std::string, int>( "three", 2) );
    map1.insert ( std::pair<std::string, int>( "four", 1) );

    for (auto it = map1.begin(); it != map1.end(); ){
        multimap2.insert(std::pair<int, std::string>( it->second, it->first));
        map1.erase(it++);
    }

   for (auto it = multimap2.rbegin(); it != multimap2.rend(); ++it)
   std::cout << it->first << " --- " << it->second << '\n';

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给了我:

4 ---一个2 ---两个2 ---三个1 ---四个

因为我需要,但......有更聪明,更有效的方法来获得相同的结果吗?它必须使用足够大的数据集......

谢谢你的时间 :)

Mik*_*our 5

另一种方法是将它们转储到一个向量中,然后对它进行排序:

typedef std::pair<std::string, int> pair;
std::vector<pair> v;
v.reserve(map1.size());
std::copy(map1.begin(), map1.end(), std::back_inserter(v));
std::sort(v.begin(), v.end(), 
    [](pair const & a, pair const & b) {
        return a.second < b.second;
    });
Run Code Online (Sandbox Code Playgroud)

这可能比插入a更快multimap,因为它只需要一次内存分配.