【问题标题】:How to sort a std::map by ascending order of value?如何按值的升序对 std::map 进行排序?
【发布时间】:2018-08-28 10:15:48
【问题描述】:

我试图弄清楚如何按值的升序对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::map 可以做到这一点吗?

【问题讨论】:

  • 您是要按升序对地图进行排序(您的文字内容和欺骗的内容)还是要对地图进行降序排序并仅按升序打印其元素(您的代码建议)
  • 建议的欺骗是错误的。这个问题是关于排序值而不是键。
  • @ZackLee 听起来您正在寻找类似的东西,boost.org/doc/libs/1_68_0/libs/multi_index/doc/index.html
  • std::sort 和谓词对向量进行排序是性能更好的解决方案。我们在谈论多少个条目?十几个人,你做什么都没关系。先进行基准测试,然后再考虑性能。
  • 所以这是几千字节的 RAM。我会从更容易编码和理解的东西开始,然后从那里开始工作。基准测试会告诉您什么是足够快的。

标签: c++ sorting stdmap


【解决方案1】:

std::map 按其排序,并且无法更改(毕竟,地图的重点是通过键快速访问)。但是,您可以创建一个指向地图元素的指针容器,并对其进行排序以进行打印。您需要通过 const 引用传递您的地图,这样您的指针就不会失效:

#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】:

    没有。无法按地图的值对地图进行排序。

    一种可能的解决方案:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 1970-01-01
      • 2018-09-05
      • 2013-11-19
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多