代码之家  ›  专栏  ›  技术社区  ›  Zack Lee

如何按值的升序对std::map进行排序?

  •  -1
  • Zack Lee  · 技术社区  · 6 年前

    我想知道如何排序 std::map 按价值的升序排列。

    我的代码:

    #include <iostream>
    #include <map>
    #include <string>
    #include <iterator>
    
    void printMapByOrder(std::map<std::string, int> mapOfPlanets)
    {
        //what should be here?
    }
    
    int main() {
    
        std::map<std::string, int> mapOfPlanets;
        mapOfPlanets["earth"] = 12;
        mapOfPlanets["jupiter"] = 142;
        mapOfPlanets["mars"] = 6;
        mapOfPlanets["mercury"] = 4;
        mapOfPlanets["neptune"] = 49;
        mapOfPlanets["pluto"] = 2;
        mapOfPlanets["saturn"] = 120;
        mapOfPlanets["uranus"] = 51;
        mapOfPlanets["venus"] = 12;
        printMapByOrder(mapOfPlanets);
    }
    

    我想要的结果是:

     pluto : 2
     mercury : 4
     mars : 6
     earth : 12
     venus : 12
     neptune : 49
     uranus : 51
     saturn : 120
     jupiter : 142
    

    这个可以用吗 STD::地图 ?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Toby Speight    6 年前

    std::map 由其订购 钥匙 这是无法改变的(毕竟,地图的点是 按键快速访问 )但是,您可以创建一个指向映射元素的指针容器,并对其进行排序以进行打印。您将希望通过常量引用传递您的映射,这样您的指针就不会无效:

    #include <algorithm>
    #include <vector>
    
    void printMapByOrder(const std::map<std::string, int>& mapOfPlanets)
    {
        using element = typename std::map<std::string, int>::value_type;
        std::vector<const element*> sorted;
        sorted.reserve(mapOfPlanets.size());
        for (auto& planet: mapOfPlanets)
            sorted.push_back(&planet);
    
        # sort by value
        std::sort(sorted.begin(), sorted.end(),
                  [](auto *a, auto *b) {
                      return std::tie(a->second, a->first)
                          <  std::tie(b->second, b->first);
                  });
    
        # print results
        std::transform(sorted.begin(), sorted.end(),
                       std::ostream_iterator<std::string>(std::cout),
                       [](const auto *p) {
                           return p->first + ": "
                               + std::to_string(p->second) + '\n';
                       });
    }
    
        2
  •  3
  •   darune    6 年前

    不可以。不能按地图的值对其进行排序。

    一种可能的解决方案:

    void printMapByOrder(std::map<std::string, int> mapOfPlanets)
    {
        std::vector < std::pair<std::string, int> > planets(mapOfPlanets.begin(), mapOfPlanets.end());
        std::sort(planets.begin(), planets.end(), [](auto lhs, auto rhs) {return lhs.second < rhs.second; });
        //print planets
    }