C++中地图的使用

C++中key-value形式的容器map、hash_map、unorderad_map、vector_map,下面是他们这四种map的使用及区别:

Map:

一种关联容器,存储相结合形成一个关键和映射元素,值类型为 pair<const Key, Data>,任何两个元素没有相同的key值。map使用红黑树实现,构建map花费的时间比较长,因而,map使用于插入和查询混合的情况。

1.Map的特点:

a.存储Key-value对
b.支持快速查找,查找的复杂度基本是log(n)
c.快速插入,快速删除,快速修改记

2.Map的缺陷:

  1. map是二叉树形状相比vector使用线性存储局部性较弱。
  2. map需要每次分配一个节点,而且map中相对于vector有很多冗余数据,比如指向子节点的指针。
  3. map每次insert都有一次查找和树的旋转。

3. Map的基本使用方法如下:

#include<iostream>
#include<string>
#include<map>
using namespace std;
typedef std::map<int ,string>Map;
typedef Map::iterator MapIt;
int main()
{
Map *map=new Map();
int key;
string value;
while(cin>>key>>value)
{
map->insert(make_pair(key,value));
}
for(MapIt it =map->begin();it!=map->end();++it)
	cout<<"key:"<<it->first<<"value:"<<it->second<<endl;
delete map;
return 0;
}



 4.Map的key可以是自定义数据结构,需要重载运算符<,重载必须是const.方法如下:

typedef struct _Key
{
	_Key(int *p, int l)
	{
		len_ = l;
		for(int i = 0; i < l; ++i)
			p_[i] = p[i];
	}
	bool operator<(const _Key &rs) const
	{
		if(len_ == rs.len_)
		{
			for(int i = 0; i < len_; ++i)
				return p_[i] < rs.p_[i];
			return false;
		}
		else
			return len_ < rs.len_;
	}
	int p_[MaxLen];
	int len_;
}Key;
typedef std::map<Key, vector<int> *> MyMap;



Hash_Map:

hash_map,都是基于hash_table实现的。首先,分配一大片内存,形成很多桶。利用hash函数,将key映射到不同的桶中,当然,也有可能会有两个不同的key映射到同一个桶中,这时,就需要判别函数来进行查找了。所以,hash_map的key需要两个条件,一个是hash函数,获得映射到的桶的值,另外一个是equal_to函数,判定两个key是否相等。显然,当每个桶里的元素个数比较平均且比较少的时候,查询性能比较高。

         1.Hash_Map的特点:

 ash_map的查找速度比map要快,因为hash_map的查找速度与数据量大小无关,属于常数级别。map的查找速度是log(n)级别。但是hash_map每次查找都需要执行hash函数,所以也比较耗时。而且hash_map很多桶中可能都没有元素,所以内存利用率不高。

2.使用方法如下:
#include <string>
#include <iostream>
#include <ext/hash_map>
using namespace std;
using namespace __gnu_cxx;
struct str_hash
{
	size_t operator()(const string &s) const
	{
		return __stl_hash_string(s.c_str());
	}
};
struct str_compare
{
	int operator()(const string &a, const string &b) const
	{
		return (a==b);
	}
};
typedef hash_map<string, string, str_hash, str_compare> StrMap;
int main()
{
	StrMap strMap;
	string a,b;
	cout<<"插入:"<<endl;
	while(cin>>a>>b)
	{
		if(a.length() <= 1)
			break;
		strMap.insert(make_pair(a,b));
	}
	cout<<"查询:"<<endl;
	while(cin>>a)
	{
		if(a.length() <= 1)
			break;
		if(strMap.find(a) != strMap.end())
			cout<<strMap[a]<<endl;
		else
			cout<<"not found"<<endl;
	}
	return 0;
}






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值