持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
1.1 map容器排序
学习目标:
- map容器默认排序规则为 按照key值进行 从小到大排序,掌握如何改变排序规则
主要技术点:
- 利用仿函数,可以改变排序规则
1.2 代码示例:
#include <map>
class MyCompare {
public:
bool operator()(int v1, int v2) {
return v1 > v2;
}
};
void test01()
{
//默认从小到大排序
//利用仿函数实现从大到小排序
map<int, int, MyCompare> m;
m.insert(make_pair(1, 10));
m.insert(make_pair(2, 20));
m.insert(make_pair(3, 30));
m.insert(make_pair(4, 40));
m.insert(make_pair(5, 50));
for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key:" << it->first << " value:" << it->second << endl;
}
}
int main() {
test01();
system("pause");
return 0;
}
1.3 ** 总结:**
- 利用仿函数可以指定map容器的排序规则
- 对于自定义数据类型,map必须要指定排序规则,同set容器
1.4 补充说明函数对象
函数对象的概念
概念: 重载函数调用操作符的类,其对象常称为函数对象。例如上面代码中的MyCompare类 函数对象使用重载的()时,行为类似函数调用,也叫仿函数
本质: 函数对象(仿函数)是一个类,不是一个函数
特点:
函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值 函数对象超出普通函数的概念,函数对象可以有自己的状态 函数对象可以作为参数传递
1.5 补充说明Map
Map集合一般用到的方法 public Set keySet() 将Map所有的key封装到一个Set集合 set…
public V get(Object key) 根据key获取Map对应的value get…
public Set<Map.Entry<K,V>> entrySet() 获取所有的键值对对象集合
public Collection values() 将Map中所有的value封装到一个Collection体系的集合中
与multiset的区别
1、set与multiset最大的区别是multiset中的元素可以重复 所以排序的时候选择multiset较为方便。
2、使用multiset查找重复元素时,找到的是中序访问的第一个元素 因为multiset底层是一个搜索二叉树,按中序遍历刚好是排完序的,由输出结果可知,找到的是中序遍历的第一个数。