set容器-内置类型指定排序规则讲解

简介: set容器-内置类型指定排序规则讲解

set 容器是 C++ 标准模板库(STL)中的一个关联容器,它存储的元素都是唯一的,并且默认按升序排列。set 容器内部通常是通过红黑树(一种自平衡的二叉搜索树)来实现的,因此其插入、删除和查找操作的时间复杂度都是对数级别的。在默认情况下,set 容器使用 less<Key> 作为比较对象,以决定元素在容器中的排序方式。

 

然而,在某些场景下,我们可能希望使用自定义的排序规则来存储元素。这时,可以通过为 set 指定自定义的比较函数对象或函数指针来实现。下面,我将详细讲解如何为 set 容器指定内置类型的排序规则,并给出相应的代码示例。

 

自定义排序规则

为 set 容器指定自定义排序规则,我们需要提供一个比较函数对象或函数指针,它应该能够接受两个参数(即 set 中元素的类型),并返回一个布尔值来表示这两个元素的大小关系。

 

比较函数对象通常是通过重载 operator() 来定义的,而函数指针则指向一个接受相同参数并返回布尔值的函数。

 

示例:为 set<int> 指定降序排序规则

假设我们想要创建一个 set 容器,用于存储整数,并希望这些整数按照降序排列。为了实现这一点,我们可以定义一个比较函数对象或函数,并在创建 set 容器时将其作为模板参数传递。

 

使用函数对象

image.png

image.png

在这个例子中,我们定义了一个名为 CompareDesc 的比较函数对象,它重载了 operator() 来实现降序比较。然后,在创建 set 容器时,我们将 CompareDesc 作为第二个模板参数传递,以指定自定义的排序规则。

 

使用函数指针

除了使用函数对象外,我们还可以使用函数指针来指定自定义排序规则。这通常涉及到定义一个全局函数或静态成员函数,并将其地址作为比较对象传递给 set。

image.png image.png

在这个例子中,我们定义了一个全局函数 compareDesc,它接受两个整数参数并返回一个布尔值来表示它们的大小关系。然后,在创建 set 容器时,我们将 compareDesc 函数的地址作为比较对象传递给 set 的构造函数。

 

总结

通过为 set 容器指定自定义的比较函数对象或函数指针,我们可以灵活地控制容器中元素的排序规则。这为我们提供了更多的可能性,以满足不同场景下的排序需求。在实际应用中,我们可以根据具体需求选择使用函数对象还是函数指针,并编写相应的比较逻辑来实现自定义排序。无论是使用函数对象还是函数指针,都需要确保比较逻辑的正确性,以避免出现意外的排序结果。

目录
相关文章
|
12天前
|
存储 C++ 容器
|
19天前
|
C++ 容器
C++之set/multiset容器
C++之set/multiset容器
10 1
|
19天前
|
C++ 容器
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
11 1
|
24天前
|
存储 算法 NoSQL
C++一分钟之-map与set容器详解
【6月更文挑战第21天】C++ STL的`map`和`set`是基于红黑树的关联容器,提供有序存储和高效查找。`map`存储键值对,键唯一,值可重复;`set`仅存储唯一键。两者操作时间复杂度为O(log n)。常见问题包括键的唯一性和迭代器稳定性。自定义比较函数可用于定制排序规则,内存管理需注意适时释放。理解和善用这些工具能提升代码效率。
15 3
|
10天前
|
存储 NoSQL Java
Redis10------Set类型,存在着无序的特征存储的顺序和插入的顺序是无关的,set集合的一大特点是不可重复,在redis中支持交集插集等特殊功能,好友列表,共同关注等等
Redis10------Set类型,存在着无序的特征存储的顺序和插入的顺序是无关的,set集合的一大特点是不可重复,在redis中支持交集插集等特殊功能,好友列表,共同关注等等
|
10天前
|
存储 NoSQL Redis
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
|
11天前
|
存储 语音技术 Python
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
|
1月前
|
存储 Java 索引
JavaSE——集合框架一(6/7)-Set系列集合:LinkedHashSet的底层原理、TreeSet集合(介绍,自定义排序规则,排序示例)
JavaSE——集合框架一(6/7)-Set系列集合:LinkedHashSet的底层原理、TreeSet集合(介绍,自定义排序规则,排序示例)
24 1
|
19天前
|
编译器 C++ 容器
通过红黑树封装 map 和 set 容器
通过红黑树封装 map 和 set 容器
|
20天前
|
安全 Java 容器
Java 1.8新特性使用记录:Filter、数据容器的转换、排序Sorted
Java 1.8新特性使用记录 有些方法一段时间不使用会忘记,这里要记录一下,方便以后使用 一、过滤Filter 二、数据容器的转换 三、List 排序
21 0