将STL地图从最低值到最大值排序

时间:2016-06-29 04:32:03

标签: c++ sorting dictionary

我有一个包含String键和int值的STL映射。我需要将项目放入具有int键和String值的新映射中,以便键从最低到最高排序。

例如,我有一张包含这些值的地图(键,值):

"A", 5
"B", 2
"C", 8
"D", 4

我希望他们的安排方式如下(键,值):

2, "B"
4, "D"
5, "A"
8, "C"

原始地图中的值成为键,键变为值。

我知道我需要将原始地图中的值添加到新地图中,但我不确定如何以从最低到最高的顺序添加它们。

3 个答案:

答案 0 :(得分:4)

沿着这些方向的东西也许:

std::map<std::string, int> old_map = ...;  // initialized somehow
std::map<int, std::string> new_map;

std::transform(old_map.begin(), old_map.end(),
  std::inserter(new_map, new_map.end()),
  [](decltype(old_map)::iterator it) {
    return std::make_pair(it->second, it->first);
  }
);

答案 1 :(得分:1)

对于原始地图中的每一对,反转该对并插入另一个地图。排序是自动的,因为std::map按键排序。

此外,如果原始地图中的多个密钥具有相同的数据(例如,"A""E"都有数据5),那么您需要使用{ {3}}而不是。

答案 2 :(得分:1)

对于std:map,按键默认排序。

Internally, the elements in a map are always sorted by its key following a specific strict weak ordering criterion indicated by its internal comparison object (of type Compare).

请阅读链接:http://www.cplusplus.com/reference/map/map/

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <map>
using namespace std;

int main() {
    map<string, int> myMap;
    myMap["D"] = 4;
    myMap["C"] = 8;
    myMap["B"] = 2;
    myMap["A"] = 5;
    cout<<"before:"<<endl;
    for_each(myMap.begin(), myMap.end(), [](auto& element){cout<<element.first<<" "<<element.second<<endl;});

    map<int, string> otherMap;
    cout<<"after:"<<endl;
    for_each(myMap.begin(), myMap.end(), [&otherMap](auto& element){otherMap[element.second] = element.first;});
    for_each(otherMap.begin(), otherMap.end(), [](auto& element){cout<<element.first<<" "<<element.second<<endl;});
    return 0;
}

以下是代码示例: 输出是:

before:
A 5
B 2
C 8
D 4
after:
2 B
4 D
5 A
8 C

所以你不要自己排序。