【问题标题】:Sorting of STL map in c++ based on value基于值的C++中STL映射的排序
【发布时间】:2020-08-17 14:37:39
【问题描述】:

我有以下地图:

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

我该怎么做?

【问题讨论】:

  • 是的。 @UlrichEckhardt 你是对的。
  • 也检查您的问题的主题。这样做,请删除“in cpp”,这不是很精确,但在您的问题中,“c++”标签可能会更好地表达。
  • @UlrichEckhardt 已编辑
  • 您仍在询问“运算符重载”。是什么让您得出相关的结论?我一直试图给你一个提示是你问错了问题!另外,顺便说一句,删除“in c++”,这就是标签的用途,不需要在主题中重复。

标签: c++ c++11 stl stdvector stdmap


【解决方案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';
    }

【讨论】:

    【解决方案2】:

    根据定义,你不能。地图是一种按键对其元素进行排序的数据结构。

    【讨论】:

      【解决方案3】:

      由于std::map 仅按键进行排序,因此您选择了错误的容器以满足您的要求。

      因此,您可以切换到使用std::vector&lt;std::pair&lt;int, int&gt;&gt; 之类的:

      #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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2022-10-28
        • 1970-01-01
        • 2016-09-23
        相关资源
        最近更新 更多