STL中map和hash_map用法和区别

1. STL map
1.1 为什么引入map
考虑如何储存一系列key-value的键值对,最简单直观的是用一个数组或者链表保存。但是考虑下这样的插入、查找、删除效率,如果要高效,就需要把这些记录的键按照顺序排列,然后按照二分法查找,同时增加记录的时候也需要保持记录有序。我们如果自己去写需要考虑一系列因素,很麻烦对吧,所以STL中的map已经帮我们设计好了这一全套,我们只需要调用接口就好了。

1.2 关于map
map是一类关联式容器,每个键key不允许重复、不可被修改,map内部自建一颗红黑树使得内部数据全部是有序排列。

1.3 map常见功能(时间复杂度大多为Log(N)):

  • 插入key-value键值对的三种方式;
map<string, int> m;
// 三种插入方式
m["c"] = 1;
m.insert(map<string, int>::value_type("b", 2));
m.insert(pair<string, int>("a", 3));
// 也可以直接等于另一个map
map<string, int> m2=m;
  • 根据key值修改value;根据key值查找记录find()函数;
// 遍历整个map
map<string, int>::iterator iter;
for (iter=m2.begin(); iter != m2.end(); iter++) {
	// 根据key值快速查找记
	if (m2.find("a") != m2.end()) {
		// 根据key值修改value
		m2["a"]++;
	}
	cout << iter->first << " : " << iter->second << ". ";
}
输出:
a : 4. b : 2. c : 1.
  • 删除键值对erase()函数;清空mapclear()函数;map长度size()函数;key是否在map中count()函数;两个map交换swap()函数;
// count()函数在则返回1,否则返回0
cout << endl << "a is in m2 " << m2.count("a") <<  ". d is in m2 " << m2.count("d") << endl;
m2.erase("a");
cout << "a is in m2 " << m2.count("a") << ", and m2's size is " << m2.size() << endl;
m2.clear();
cout << "now m2's size is " << m2.size() <<endl;
m2.swap(m);
cout << "now m2's size is " << m2.size() <<endl;
输出:
a is in m2 1. d is in m2 0
a is in m2 0, and m2's size is 2
now m2's size is 0
now m2's size is 3
  • 非标准数据的操作

map对于标准数据自动对key键从小到大排序,而对于非标准数据,需要自定义数据排序方式,否则在插入时将会编译报错。

typedef struct students{
    int id;
    string name;
    bool operator < (students const& S) const{
        if(id < S.id) {
            return true;
        }
        else if (id == S.id) {
            return name.compare(S.name);
        }
        else {
            return false;
        }
    }
} student;
map<student, int> s;
student s1, s2;
s1.id = 1;
s1.name = "zhangsan";
s2.id = 2;
s2.name = "lisi";
s.insert(map<student, int>::value_type(s2, 92));
s.insert(map<student, int>::value_type(s1, 90));
map<student, int>::iterator iters;
for (iters=s.begin(); iters!=s.end(); iters++) {
    cout << iters->first.id << " " << iters->first.name << "'s score is " << iters->second << ". ";
}
输出:
1 zhangsan's score is 90. 2 lisi's score is 92. 

2. STL hash_map
2.1 为什么引入hash_map
map的时间复杂度是O(logN),如果想进一步提高效率,那么需要牺牲空间换取时间,这就引入了hash_map,与map底层使用的红黑树不同,hash_map底层使用的是hash表,这样可以使时间复杂度降到常数级别。
在当前可利用内存越来越多的情况下,这种用空间换时间的做法有时候是值得的。

2.2 hash_map操作
大体上和map差不多,也有insert、size()、erase()、clear()、find()、count()等方法,使用起来也很相似;
但是对于自定义的数据类型,map定义<比较函数,而hash_map需要定义hash函数和equal等于比较函数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值