根据值对c ++中的STL映射进行排序

问题描述 投票:0回答:3

我有以下地图:

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

我该怎么做?

c++ c++11 stl stdvector stdmap
3个回答
1
投票
您可以反转键和值并将其插入到std :: multimap中,然后可以遍历std :: multimap以所需的顺序获取值。

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'; }


0
投票

根据定义,您不能。映射是一种按键对元素进行排序的数据结构。


0
投票
由于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

© www.soinside.com 2019 - 2024. All rights reserved.