set容器一自定义数据类型指定排序规则讲解

简介: set容器一自定义数据类型指定排序规则讲解

set 容器是 C++ 标准库中的一个关联容器,它存储的元素是唯一的,并且默认按照升序排列。当 set 容器存储自定义数据类型时,我们需要为这些类型定义排序规则。默认情况下,set 容器会使用 < 运算符来确定元素间的顺序,但对于自定义类型,我们可能需要定义自己的比较逻辑。

 

为了指定自定义数据类型的排序规则,我们可以为 set 容器提供一个比较函数对象或 lambda 表达式作为模板参数。比较函数对象或 lambda 表达式应该接受两个自定义类型的参数,并返回一个布尔值来表示这两个元素的大小关系。

 

下面,我将通过一个具体的例子来详细讲解如何为 set 容器中的自定义数据类型指定排序规则。

 

自定义数据类型

首先,我们定义一个简单的自定义数据类型 Person,它包含姓名和年龄两个属性。

image.png

在这个例子中,我们为 Person 类型重载了 < 运算符,以便在需要默认排序时使用。但请注意,这并不意味着我们必须重载 < 运算符才能为 set 提供自定义排序规则。实际上,我们可以完全忽略这个重载,并通过为 set 提供自定义比较函数对象来定义排序逻辑。

 

自定义排序规则

现在,假设我们想要根据 Person 的姓名对 set 中的元素进行排序,而不是年龄。为了实现这一点,我们可以定义一个比较函数对象或 lambda 表达式。

 

使用比较函数对象

image.png

在这个例子中,我们定义了一个名为 NameComparator 的比较函数对象,它接受两个 Person 对象作为参数,并根据它们的姓名进行比较。然后,在创建 set 容器时,我们将 NameComparator 作为第二个模板参数传递,以指定按姓名排序的规则。

 

使用 lambda 表达式(C++11 及以后版本)

从 C++11 开始,我们还可以使用 lambda 表达式来定义比较逻辑,这使得代码更加简洁。

image.png

在这个例子中,我们使用了一个 lambda 表达式作为 set 容器的比较函数。decltype 关键字用于推断 lambda 表达式的类型,并将其作为模板参数传递给 set。lambda 表达式本身接受两个 Person 对象,并根据它们的姓名进行比较。

目录
相关文章
|
1月前
|
存储 C++ 容器
set容器-set和multiset区讲解
set容器-set和multiset区讲解
14 0
|
算法 程序员 C语言
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
50 0
|
1月前
|
存储 C++ 容器
set容器-内置类型指定排序规则讲解
set容器-内置类型指定排序规则讲解
16 0
|
1月前
|
C++ 容器
set容器-构造和赋值讲解
set容器-构造和赋值讲解
17 0
|
1月前
|
搜索推荐 算法 C++
list容器-排序案例讲解
list容器-排序案例讲解
9 0
|
3天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
17 3
|
1月前
|
存储 自然语言处理 C++
map和set的简单介绍
map和set的简单介绍
20 1
|
1月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
3月前
|
JavaScript 前端开发 定位技术
JavaScript 中如何代理 Set(集合) 和 Map(映射)
JavaScript 中如何代理 Set(集合) 和 Map(映射)
50 0
|
3月前
|
存储 安全 Java
Map和Set(JAVA)
Map和Set(JAVA)
50 1