21xrx.com
2024-12-27 10:57:32 Friday
登录
文章检索 我的文章 写文章
C++中如何对Map进行排序
2023-07-04 14:47:30 深夜i     --     --
C++ Map 排序

在C++中,Map是一种常用的关联容器,它的特点是可以自动排序并快速查找元素。但是有时候我们需要对Map中的元素进行排序,那么如何实现呢?

C++中的Map是通过红黑树实现的,因此Map的自动排序是通过红黑树的自动平衡机制实现的。但是在实际应用中,如果我们需要按照键或值的顺序对Map进行排序,就需要调用一些STL提供的算法。

1. 按照键排序

按照键排序的方法比较简单,我们可以先将Map中的键值对复制到一个vector容器中,然后通过sort函数对vector进行排序,最后再将排序后的vector中的元素赋回到Map中即可。

示例代码如下:


#include <iostream>

#include <map>

#include <vector>

#include <algorithm>

using namespace std;

int main() {

  map<string, int> m{ 3, "banana", "pear", 4};

  vector<pair<string, int>> v(m.begin(), m.end());

  sort(v.begin(), v.end(), [](const pair<string, int> &a, const pair<string, int> &b)

    return a.first < b.first;

  );

  map<string, int> sorted_map;

  for (auto &p: v) {

    sorted_map.insert(p);

  }

  for (auto &p: sorted_map)

    cout << p.first << " " << p.second << endl;

  

  return 0;

}

在上面的代码中,首先定义了一个Map m,里面包含了4个键值对,接着将m中的元素复制到了一个vector容器v中。然后通过sort函数将vector按照键值进行排序,排序的方式是通过一个lamda表达式来指定的。最后将排序后的vector中的元素插入到一个新的Map容器sorted_map中,并将结果输出到屏幕上。

2. 按照值排序

按照值排序的方法有多种,其中一种比较简单的方法是使用STL中已经实现好的multi_map和reverse_iterator。

示例代码如下:


#include <iostream>

#include <map>

#include <algorithm>

#include <iterator>

#include <vector>

using namespace std;

int main() {

  map<string, int> m{"apple", 2, 1, "orange"};

  multimap<int, string> mm;

  transform(m.begin(), m.end(), inserter(mm, mm.begin()), [](const pair<string, int> &a) {

    return make_pair(a.second, a.first);

  });

  for (auto it = mm.rbegin(); it != mm.rend(); ++it)

    cout << it->second << " " << it->first << endl;

  

  return 0;

}

在上面的代码中,首先定义一个Map m,里面包含了4个键值对,然后定义了一个multimap容器mm和一个lambda表达式,这个lambda表达式的作用是将Map中的键值对转化为值和键对应的pair。接着通过transform和inserter函数将转换后的pair插入到multimap中。最后通过reverse_iterator遍历multimap容器,将排序结果按照值从大到小进行输出。

总之,对于Map的排序,可以使用STL中提供的多种排序算法来实现。但是需要注意的是,在进行排序之前,需要将Map中的键值对转换为适合排序的形式,例如转换为pair容器或multimap容器等。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复