21xrx.com
2025-03-19 10:06:42 Wednesday
文章检索 我的文章 写文章
C++ Map 排序
2023-07-13 07:06:07 深夜i     17     0
C++ Map 排序

C++ Map 是一种用于将键值对关联的容器。在 Map 中,每个 Key 只能出现一次,而且是按照 Key 升序排序的。但有时我们需要根据 Value 来对 Map 进行排序,本文就来介绍几种 C++ Map 排序的方法。

1. 使用 Lambda 表达式进行排序

Lambda 表达式是 C++11 中引入的一种函数对象,它可以在调用时定义,因此非常灵活。我们可以使用 Lambda 表达式来根据 Value 对 Map 进行排序,示例代码如下:

// 定义一个 Map,存储名字和年龄
std::map<std::string, int> personMap;
personMap["Tom"] = 22;
personMap["Jerry"] = 18;
personMap["Alice"] = 20;
personMap["Bob"] = 19;
// 定义一个 Lambda 表达式,根据 Value 对 Map 进行排序
auto cmp = [] (const std::pair<std::string, int>& p1, const std::pair<std::string, int>& p2)
  return p1.second < p2.second;
;
// 将 Map 转换为 vector,并使用 sort 函数进行排序
std::vector<std::pair<std::string, int>> vec(personMap.begin(), personMap.end());
std::sort(vec.begin(), vec.end(), cmp);
// 遍历排序后的 vector,输出每个人的名字和年龄
for (const auto& p : vec) Age: " << p.second << std::endl;

2. 使用自定义比较函数进行排序

除了使用 Lambda 表达式,我们也可以定义一个自定义比较函数来对 Map 进行排序。自定义比较函数类型应该是一个函数对象,它应该重载 () 运算符,接收两个参数,返回一个布尔值。返回真时表示第一个参数应该在第二个参数前,否则在后。

下面是一个示例代码:

struct Compare {
  bool operator() (const std::pair<std::string, int>& p1, const std::pair<std::string, int>& p2)
    return p1.second < p2.second;
  
};
// 将自定义比较函数作为第二个参数传递给 Map 的构造函数
std::map<std::string, int, Compare> personMap;
personMap["Tom"] = 22;
personMap["Jerry"] = 18;
personMap["Alice"] = 20;
personMap["Bob"] = 19;
// 将 Map 转换为 vector,并使用 sort 函数进行排序
std::vector<std::pair<std::string, int>> vec(personMap.begin(), personMap.end());
std::sort(vec.begin(), vec.end(), Compare());
// 遍历排序后的 vector,输出每个人的名字和年龄
for (const auto& p : vec)
  std::cout << "Name: " << p.first << "

3. 使用 boost 库进行排序

除了使用 C++ 标准库,我们也可以使用 boost 库来对 Map 进行排序。boost 库中提供了一个名为 boost::multi_index_container 的容器,它可以满足类似 Map 的需求,并提供了多个索引,可以根据不同的 Key 进行排序。

下面是一个示例代码:

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
struct Person
  std::string name;
  int age;
;
// 定义一个 multi_index_container,存储 Person
typedef boost::multi_index_container<
  Person,
  boost::multi_index::indexed_by<
    boost::multi_index::ordered_unique<boost::multi_index::member<Person, std::string, &Person::name>>,
    boost::multi_index::ordered_non_unique<boost::multi_index::member<Person, int, &Person::age>>
  >
> PersonContainer;
// 定义一个 PersonContainer,并添加几个 Person 对象
PersonContainer personContainer;
personContainer.insert( 22);
personContainer.insert( 18);
personContainer.insert("Alice");
personContainer.insert( 19);
// 获取按照年龄排序的索引,并遍历索引中的元素,输出人名和年龄
auto& ageIndex = personContainer.get<1>();
for (auto it = ageIndex.begin(); it != ageIndex.end(); ++it) Age: " << it->age << std::endl;

总结

以上就是几种 C++ Map 排序的方法,对于简单的需求可以使用 Lambda 表达式或自定义比较函数,而对于更复杂的需求可以考虑使用第三方库,如 boost。希望本文能给大家带来帮助。

  
  

评论区