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 对象,并根据它们的姓名进行比较。

目录
相关文章
|
12月前
|
监控 Serverless 文件存储
函数计算产品使用问题之如何确保新建的实例拉取的是最新的自定义容器镜像
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
10月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
11月前
|
NoSQL Redis
Redis set数据类型命令使用及应用场景使用总结
Redis set数据类型命令使用及应用场景使用总结
86 1
|
11月前
|
消息中间件 JSON NoSQL
Redis深度解析:核心数据类型之hash、list、set
Redis深度解析:核心数据类型之hash、list、set
|
10月前
|
测试技术 索引 Python
Python接口自动化测试框架(基础篇)-- 常用数据类型list&set()
本文介绍了Python中list和set两种数据类型的使用,包括它们的创建、取值、增删改查操作、排序以及内置函数的使用,还探讨了list的比较函数和set的快速去重功能。
100 0
|
10月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
101 0
|
存储 Java 索引
JavaSE——集合框架一(6/7)-Set系列集合:LinkedHashSet的底层原理、TreeSet集合(介绍,自定义排序规则,排序示例)
JavaSE——集合框架一(6/7)-Set系列集合:LinkedHashSet的底层原理、TreeSet集合(介绍,自定义排序规则,排序示例)
87 1
|
存储 NoSQL Redis
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key
|
1月前
|
关系型数据库 MySQL Docker
|
9天前
|
Docker 容器
Docker网关冲突导致容器启动网络异常解决方案
当执行`docker-compose up`命令时,服务器网络可能因Docker创建新网桥导致IP段冲突而中断。原因是Docker默认的docker0网卡(172.17.0.1/16)与宿主机网络地址段重叠,引发路由异常。解决方法为修改docker0地址段,通过配置`/etc/docker/daemon.json`调整为非冲突段(如192.168.200.1/24),并重启服务。同时,在`docker-compose.yml`中指定网络模式为`bridge`,最后通过检查docker0地址、网络接口列表及测试容器启动验证修复效果。