10026map容器排序

122 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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底层是一个搜索二叉树,按中序遍历刚好是排完序的,由输出结果可知,找到的是中序遍历的第一个数。