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

目录
相关文章
|
1月前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
259 2
|
17小时前
|
XML Java 数据格式
手写spring第八章-定义标记类型Aware接口,实现感知容器对象
手写spring第八章-定义标记类型Aware接口,实现感知容器对象
4 0
|
10天前
|
索引 Python
python 格式化、set类型和class类基础知识练习(上)
python 格式化、set类型和class类基础知识练习
33 0
|
1月前
|
存储 C++ 容器
在C++的set的作用类型
在C++的set的作用类型
9 0
|
1月前
|
存储 C++ 索引
在C++语言中容器的选择类型
在C++语言中容器的选择类型
12 0
|
1月前
|
存储 C++ 容器
set容器一自定义数据类型指定排序规则讲解
set容器一自定义数据类型指定排序规则讲解
18 1
|
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