时间:2021-05-20
前面在讲解如何创建 map、multimap、set 以及 multiset 容器时,遗留了一个问题,即如何自定义关联式容器中的排序规则?
实际上,为关联式容器自定义排序规则的方法,已经在 《STL priority_queue自定义排序方法》一节中做了详细的讲解。换句话说,为 Priority_queue 容器适配器自定义排序规则的方法,同样适用于所有关联式容器。
总的来说,为关联式容器自定义排序规则,有以下 2 种方法。
在掌握此方法之前,读者必须对函数对象有基本的了解,可阅读《C++函数对象》一节。
无论关联式容器中存储的是基础类型(如 int、double、float 等)数据,还是自定义的结构体变量或类对象(包括 string 类),都可以使用函数对象的方式为该容器自定义排序规则。
下面样例以 set 容器为例,演示了如何用函数对象的方式自定义排序规则:
程序执行结果为:
http://jb51.net.net/stl/
http://jb51.net.net/java/
http://jb51.net.net/python/
重点分析一下 6~13 行代码,其定义了一个函数对象类,并在其重载 () 运算符的方法中自定义了新的排序规则,即按照字符串的长度做升序排序。在此基础上,程序第 17 行代码中,通过将函数对象类的类名 cmp 通过 set 类模板的第 2 个参数传递给 myset 容器,该容器内部排序数据的规则,就改为了以字符串的长度为标准做升序排序。
需要注意的是,此程序中创建的 myset 容器,由于是以字符串的长度为准进行排序,因此其无法存储相同长度的多个字符串。
另外,C++ 中的 struct 和 class 非常类似(有关两者区别,可阅读《C++ struct和class到底有什么区别》一文),前者也可以包含成员变量和成员函数。因此上面程序中,函数对象类 cmp 也可以使用 struct 关键字创建:
值得一提的是,在定义函数对象类时,也可以将其定义为模板类。比如:
注意,此方式必须保证 T 类型元素可以直接使用关系运算符(比如这里的 < 运算符)做比较。
其实在 STL 标准库中,本就包含几个可供关联式容器使用的排序规则,如表 1 表示。
表 1 C++ STL标准库适用于关联式容器的排序规则
排序规则 功能 std::less<T> 底层采用 < 运算符实现升序排序,各关联式容器默认采用的排序规则。 std::greater<T> 底层采用 > 运算符实现降序排序,同样适用于各个关联式容器。 std::less_equal<T> 底层采用 <= 运算符实现升序排序,多用于 multimap 和 multiset 容器。 std::greater_equal<T> 底层采用 >= 运算符实现降序排序,多用于 multimap 和 multiset 容器。
值得一提的是,表 1 中的这些排序规则,其底层也是采用函数对象的方式实现的。以 std::less<T> 为例,其底层实现为:
在此基础上,当关联式容器中存储的数据类型为自定义的结构体变量或者类对象时,通过对现有排序规则中所用的关系运算符进行重载,也能实现自定义排序规则的目的。
注意,当关联式容器中存储的元素类型为结构体指针变量或者类的指针对象时,只能使用函数对象的方式自定义排序规则,此方法不再适用。
举个例子:
程序执行结果为:
http://jb51.net.net/c/
http://jb51.net.net/stl/
http://jb51.net.net/python/
在这个程序中,虽然 myset 容器表面仍采用默认的 std::less<T> 排序规则,但由于我们对其所用的 < 运算符进行了重载,使得 myset 容器内部实则是以字符串的长度为基准,对各个 mystring 类对象进行排序。
另外,上面程序以全局函数的形式实现对 < 运算符的重载,还可以使用成员函数或者友元函数的形式实现。其中,当以成员函数的方式重载 < 运算符时,该成员函数必须声明为 const 类型,且参数也必须为 const 类型:
至于参数的传值方式是采用按引用传递还是按值传递,都可以(建议采用按引用传递,效率更高)。
同样,如果以友元函数的方式重载 < 运算符时,要求参数必须使用 const 修饰:
当然,本节所讲自定义排序规则的方法并不仅仅适用于 set 容器,其它关联式容器(map、multimap、multiset)也同样适用,有兴趣的读者可自行编写代码验证。
到此这篇关于C++ STL关联式容器自定义排序规则的2种方法的文章就介绍到这了,更多相关C++ STL关联式容器自定义排序内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
excel是我们常用的办公软件,有时默认排序顺序不理想,想重新自定义,那么excel2010怎么修改排序规则?下面小编带来excel自定义排序规则的设置方法,希
介绍STL(standardtemplatelibrary)标准模板库,是一种高效的C++程序库。STL分为三类:container(容器),iterator(
本文实例讲述了Java针对ArrayList自定义排序的2种实现方法。分享给大家供大家参考,具体如下:Java中实现对list的自定义排序主要通过两种方式1)让
Arrays.sort(T[],Comparator<?superT>c)方法用于对象数组按用户自定义规则排序.官方Java文档只是简要描述此方法的作用
STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用。下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是