unordered_map是C++11提供的新容器。
unordered_map和map的区别有:
1.map不允许重复元素。unordered_map允许重复元素。
2.map内部实现了红黑树,会对键名排序,查找的时间复杂度可达到O(logn)。 unordered_map内部实现了一个哈希表,查找的时间复杂度可达到O(1)。
map
优点:有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作
红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高
缺点: 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保
存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间
适用处:对于那些有顺序要求的问题,用map会更高效一些
unordered_map:
优点: 因为内部实现了哈希表,因此其查找速度非常的快
缺点: 哈希表的建立比较耗费时间
适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map
总结:
unordered_map执行效率要比map高很多
unordered_map的用法:
创建
unordered_map<int, string> myMap 键类型、值类型
插入
unordered_map<int, string> myMap = { { 5, "张大" },{ 6, "李五" } };//使用{}赋值 myMap[2] = "李四"; //使用[ ]进行单个插入,若已存在键值2,则赋值修改,若无则插入。 myMap.insert(pair<int, string>(3, "陈二"));//使用insert和pair插入
查找
auto iterator = myMap.find(2);//find()返回一个指向2的迭代器 if (iterator != myMap.end()) cout << endl << iterator->first << "," << iterator->second << endl;
迭代器访问
- map.end()指向map的最后一个元素之后的地址,无论执行map.erase(iter)还是map.add(key, value),map.end()所返回的值永远不会发生变化,都是指向同一块内存。
- map.begin()指向map的第一个元素,map.begin()可能随着map.erase(iter)或是map.add(key, value)操作而发生改变。例如当第一个元素被删除后,map.begin()就发生了改变,指向原来第一个元素之后的那个元素了。或是如果新插入一个键值对,该键值对的key放到btree(我们假设map内部是由btree实现的,实际上也可能有别的实现方式)中会排在map.begin()->first的前面,那么map.begin()也会指向新插入的这个键值对了。
- map.erase(iter)执行后,当前iter就失去意义了,再执行++iter就会出问题。
cout << myMap[2] << endl;
直接返回2的值;如果键名是自定义类型,或者字符串、其他类型; 第一种是:重载==操作符,利用equal_to;另一种方法就是使用函数对象。自定义一个比较函数体。