21xrx.com
2024-11-05 16:34:03 Tuesday
登录
文章检索 我的文章 写文章
C++ Map 排序
2023-07-13 07:06:07 深夜i     --     --
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。希望本文能给大家带来帮助。

  
  

评论区

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