相关内容: C++ STL: map自定义键值类型、C++ 函数对象(函数符)本文目录
- 1. map定义
- 2. 按key排序
- 3. 按value排序
- 3.1 通过序列容器调用sort
- 3.2 替换map的key和value
- 4. 参考文章
template < class Key,//map::key_tpe
class T,//map::mapped_type
class Compare = less,//map::key_compare
class Alloc = allocator>//map::allocator_type
> class map;
- 第1个参数存储了key。
- 第2个参数存储了mapped value。
- 第3个参数是比较函数的函数对象。map用它来判断两个key的大小,并返回bool类型的结果。利用这个函数,map可以确定元素在容器中遵循的顺序以及两个元素键是否相等(!comp(a,b)&&!comp(b,a)),确保map中没有两个元素可以具有等效键。这里,它的默认值是less
,定义如下。
template
struct less { bool operator() (const T& x, const T& y) const {return x < y; } typedef T first_argument_type; typedef T second_argument_type; typedef bool result_type; };
- 第4个参数是用来定义存储分配模型的。
其中,less为其默认的函数对象,所以如果我们不指定参数3,map键值对就会按照默认方法进行存储。当我们希望它能以不同的方式进行排序,就需要重新指定参数3。
如果只是调用C++标准库自带的方法,我们只需如下所示,在声明map对象时指定第3参数即可。
#include
#include
然而,当我们自定义map的键值类型时,C++标准库往往没有对应的函数对象可供使用,这时候,我们就需要自定义函数对象了。关于方法,我在C++ STL: map自定义键值类型这篇文章里讲得非常详细,文中提出了针对自定义键值排序的4种方法。
3. 按value排序对value的排序,我查了很多资料,主要有以下两个思路。
- 一是通过将map转换到序列容器,再用STL提供的sort方法得以实现的。
- 二是通过将map的key和value位置替换
为什么我们不能直接用sort给map排序呢?
这是因为sort算法只能对序列容器进行排序,就是线性的(如vector,list,deque)。map虽然也是一个集合容器,但是它不是线性存储的(比如红黑树)。因此,我们需要先把map中的元素放到序列容器中,然后再对这些元素进行排序。
根据定义,sort算法的第3个参数即可以是函数指针,也可以是函数对象(可以以函数方式与()结合使用的任意对象,包括函数名、指向函数的指针和重载了“operator()”操作符的类对象)。
下面的算法,给出了函数对象的两种情况。
#include
#include
【结果】
> sort by key
Alice: 3
Bob: 7
Cindy: 5> sort by value
Alice: 3
Cindy: 5
Bob: 7
3.2 替换map的key和value
方法2通过std::transform实现替换,下面是transform的定义。
//一元操作
template
OutputIterator transform (InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperation op);
//二元操作
template
OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
BinaryOperation binary_op);
对于一元操作,op将应用于[first1, last1]范围内的每个元素,并将每个操作返回的值存储在以result开头的范围内。给定的op将被连续调用last1-first1+1次。op可以是函数指针或函数对象或lambda表达式。二元操作,本文不会用到,这里不做说明。
因此,基于上面的定义,我们的程序如下所示。
#include
#include
【C++ STL: map的按key和按value排序】【结果】
> sort by key
Alice: 3
Bob: 7
Cindy: 5> sort by value
3: Alice
5: Cindy
7: Bob
4. 参考链接
- 参考1: https://blog.csdn.net/iicy266/article/details/11906189
- 参考2: https://blog.csdn.net/qq_17550379/article/details/80959968
推荐阅读
- 个人日记|K8s中Pod生命周期和重启策略
- 学习分享|【C语言函数基础】
- C++|C++浇水装置问题
- 数据结构|C++技巧(用class类实现链表)
- C++|从零开始学C++之基本知识
- 步履拾级杂记|VS2019的各种使用问题及解决方法
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- 动态规划|暴力递归经典问题
- 麦克算法|4指针与队列
- 遇见蓝桥遇见你|小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题