码迷,mamicode.com
首页 > 编程语言 > 详细

[C/C++标准库]_[初级]_[map的查找函数分析]

时间:2015-05-31 20:11:55      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:map   vector   find   count   查找   

场景:

1. map在查找非数值索引(数值非重复索引可以使用vector)的对象时是高效率的,因为用的红黑树的实现,查找和插入都是logarithmic time 效率很高.

2.map可以说是很实用的数据结构.

3.使用multimap可以存储重复key,使用场景就是1对多的情况,比如一个联系人对应多个分组.


void TestMap()
{
	//map一般是通过红黑树来实现.http://en.cppreference.com/w/cpp/container/map
	//multimap也一样的
	//这里提示下map的优点是key是自动排序的,当然可以设置key的排序方式.在map的构造函数里.
	//1.判断map里是否包含某个key.可以使用count和find.
	//find是找到第一个之后可以直接使用,count只是统计个数.两个的时间其实是一样的,
	//硬要说的话是find找到第一个之后直接结束,对于map这种只有唯一key的速度是一样的,时间复杂度是 logarithmic time
	typedef map<int,int> TMap;
	typedef multimap<int,int> TTMap;
	TMap m;
	m[1] = 8;
	m[2] = 10;
	m[5] = 11;
	
	TTMap mm;
	mm.insert(pair<int,int>(1,8));
	mm.insert(pair<int,int>(2,10));
	mm.insert(pair<int,int>(1,11));
	mm.insert(pair<int,int>(1,12));

	//count
	int count = 0;
	if(count = m.count(1))
	{
		//1.如果要使用,还是得使用[]查找一次.
		//输出: m.count(1): 1
		cout << "m.count(1): " << count << endl;
	}

	if(count = mm.count(1))
	{
		//1.如果要使用,还是得使用equal_range查找一次.
		//multimap没有[]操作符重载,因为key不是唯一.
		//输出 mm.count(1): 3
		cout << "mm.count(1): " << count << endl;
	}

	//查看下count的实现,是使用equal_range来实现的.
	//equal_range是获取所有等于key的value组成一个连续的iterator,
	//其中pair第一个是匹配key的第一个iterator,第二个是大于key的第一个iterator.
	//map
	pair<TMap::iterator,TMap::iterator> values =  m.equal_range(1);
	TMap::iterator b = values.first;
	//输出 map equal_range: 8
	while(b != values.second)
	{
		cout << "map equal_range: " << (*b).second << endl;
		++b;
	}

	//multimap
	pair<TTMap::iterator,TTMap::iterator> valuess =  mm.equal_range(1);
	TTMap::iterator bs = valuess.first;
	
	
	//输出:
	//multimap equal_range: 8
	//multimap equal_range: 11
	//multimap equal_range: 12
	while(bs != valuess.second)
	{
		cout << "multimap equal_range: " << (*bs).second << endl;
		++bs;
	}

	//Find,找到匹配key的第一个iterator,不能找到第二个,如果需要找第二个,使用equal_range
	//Find 使用lower_bound来实现查找,lower_bound 查找大于或等于key的第一个元素.
	//与之类似的upper_bound来实现查找,它查找大于key的第一个元素.
	TMap::iterator ite = m.find(1);
	if(ite != m.end())
	{
		//1.直接使用iterator即可
		//输出: m.find 8
		cout << "m.find " << (*ite).second << endl;;
	}
	ite = m.lower_bound(3);
	if(ite != m.end())
	{
		//输出 m.lower_bound key 5 m.lower_bound 11
		cout << "m.lower_bound key " << (*ite).first << " m.lower_bound " << (*ite).second << endl;
	}
	//multimap
	bs = mm.lower_bound(1);
	if(ite != m.end())
	{
		//输出: mm.lower_bound key 1 mm.lower_bound 8
		cout << "mm.lower_bound key " << (*bs).first << " mm.lower_bound " << (*bs).second << endl;
	}
	bs = mm.upper_bound(1);
	if(ite != m.end())
	{
		//输出: mm.upper_bound key 2 mm.upper_bound 10
		cout << "mm.upper_bound key " << (*bs).first << " mm.upper_bound " << (*bs).second << endl;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	TestMap();

	return 0;
}


[C/C++标准库]_[初级]_[map的查找函数分析]

标签:map   vector   find   count   查找   

原文地址:http://blog.csdn.net/infoworld/article/details/46291043

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!