标准当中新增加了四个无序关联容器。他们是通过哈希函数和关键字类型的==运算符来组织元素,所以不会根据key值对存储的元素进行排序。
除了哈希管理操作之外,无序关联容器与关联容器有相同的操作,如find,insert等。
自定义关键字
由于无序关联容器太多,这里只针对unordered_map进行说明。
默认情况下,我们无序为unordered_map提供hash函数,因为标准库为内置类型(包括指针)提供了hash模板。但是,如果我们用自定义类类型作为关键字类型的话,就需要提供自己的hash模板。
//key_type
struct KEY
{
string author;
int age;
KEY(string s,int a):author(s),age(a){}
bool operator==(const KEY &key)const {
return author == key.author;
}
};
//hash函数
struct myhash {
size_t operator()(const KEY& key)const {
return hash<string>()(key.author); //利用了string的hash函数来实现。
}
};
int main()
{
unordered_map<KEY, size_t,myhash> mm;
KEY k1("john", 20);
KEY k2("awith", 30);
mm.insert({ k1,10 });
mm.insert({ k2,20 });
for (auto it = mm.begin();it != mm.end();it++) {
cout << it->first.author.c_str() << endl;
}
system("pause");
return 0;
}
桶管理
由于使用hash函数来组织元素,所有就会产生冲突,无序关联容器在存储上组织为一组桶。使用哈希函数将元素映射到桶中,具有相同的哈希值的所有元素在相同的桶中,如果容器允许重复关键字,具有相同的关键字的元素也在同一桶中。无序关联容器的性能依赖于哈希函数的质量和桶的数量和大小。
unordered_map与map的区别
- 在运行效率方面:unordered_map高,而map效率低但提供了稳定效率和有序。
- 占用内存方面:map内存占用略低,unordered_map内存略高,而且是线性成比例的。
- 需要无序容器,快速查找删除,不担心略高的内存时用unordered_map;有序容器稳定查找删除效率,内存很在意时候用map。
- 非频繁用map比较稳定,频繁的查询用hash_map效率会高一点,c++11中的unordered_map查询效率会更高一些,但是内存占用比hash_map稍微大点;
- 若考虑有序,查询速度稳定,容器元素量少于1000,非频繁查询那么考虑使用map。