我有一个包含String键和int值的STL映射。我需要将项目放入具有int键和String值的新映射中,以便键从最低到最高排序。
例如,我有一张包含这些值的地图(键,值):
"A", 5
"B", 2
"C", 8
"D", 4
我希望他们的安排方式如下(键,值):
2, "B"
4, "D"
5, "A"
8, "C"
原始地图中的值成为键,键变为值。
我知道我需要将原始地图中的值添加到新地图中,但我不确定如何以从最低到最高的顺序添加它们。
答案 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
所以你不要自己排序。