我有以下地图:
map<int, int> mp;
mp[11] = 5;
mp[3] = 7;
mp[1] = 3;
如果我像这样遍历地图:
for(auto it: mp) {
cout<<it.first<<" "<<it.second<<'\n';
}
然后输出将是:
1 3
3 7
11 5
但是我希望哪个键具有更大的价值,所以该键将首先出现。该情况的示例输出:
3 7
11 5
1 3
我该怎么做?
map<int, int> mp;
mp[11] = 5;
mp[3] = 7;
mp[1] = 3;
std::multimap<int, int> mulp;
std::transform(mp.begin(), mp.end(), std::inserter(mulp, mulp.begin()),
[](const std::pair<int, int> &p){
return std::make_pair(p.second, p.first);
});
for(auto it = mulp.rbegin(); it != mulp.rend(); ++it) {
cout<<it->second<<" "<<it->first<<'\n';
}
根据定义,您不能。映射是一种按键对元素进行排序的数据结构。
std::map
仅通过键进行排序,因此您为您的需求选择了错误的容器。因此,您可以像这样使用std::vector<std::pair<int, int>>
进行切换:
#include <iostream>
#include <vector>
int main() {
std::vector<std::pair<int, int>> v;
v.emplace_back(11, 5);
v.emplace_back(3, 7);
v.emplace_back(1, 3);
std::sort(
std::begin(v), std::end(v),
[](auto&& lhs, auto&& rhs) {
return lhs.second > rhs.second;
}
);
for (auto const& i : v) {
std::cout << i.first << " " << i.second << std::endl;
}
}
并且输出将是:
3 7 11 5 1 3