map和unordered_map
原文:https://blog.csdn.net/qq_41950186/article/details/107189724
map:红黑树实现
unordered_map:哈希表实现
map:
1. 元素有序,并且具有自动排序的功能(因为红黑树具有自动排序的功能)
2. 元素按照二叉搜索树存储的,也就是说,其左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值,使用中序遍历可将键值按照从小到大遍历出来
3. 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间
4. 适用情况:对顺序有要求的情况下,如排序等
unordered_map:
1. 元素无序。
2. 查找速度非常的快。
3. 哈希表的建立比较耗费时间
4. 适用情况:对于查找问题
5. 对于unordered_map或者unordered_set容器,其遍历顺序与创建该容器时输入元素的顺序是不一定一致的,遍历是按照哈希表从前往后依次遍历的
总结:
内存占有率的问题就转化成红黑树 VS hash表 , 还是unorder_map占用的内存要高。
但是unordered_map执行效率要比map高很多
对于unordered_map或unordered_set容器,其遍历顺序与创建该容器时输入的顺序不一定相同,因为遍历是按照哈希表从前往后依次遍历的
内置函数:
| begin() | 返回指向map头部的迭代器 |
| clear() | 删除所有元素 |
| count() | 返回指定元素出现的次数 |
| empty() | 如果map为空则返回true |
| end() | 返回指向map末尾的迭代器 |
| equal_range() | 返回特殊条目的迭代器对 |
| erase() | 删除一个元素 |
| find() | 查找一个元素 |
| get_allocator() | 返回map的配置器 |
| insert() | 插入元素 |
| key_comp() | 返回比较元素key的函数 |
| lower_bound() | 返回键值>=给定元素的第一个位置 |
| max_size() | 返回可以容纳的最大元素个数 |
| rbegin() | 返回一个指向map尾部的逆向迭代器 |
| rend() | 返回一个指向map头部的逆向迭代器 |
| size() | 返回map中元素的个数 |
| swap() | 交换两个map |
| upper_bound() | 返回键值>给定元素的第一个位置 |
| value_comp() | 返回比较元素value的函数 |
简单示例:
// map使用 class MapSTL { public: void Update() { map<string, int> student; // 直接键值索引,存在则更新数据,没有则插入 student["Zhang"] = 27; // pair插入, 键值已存在则会插入失败 student.insert(pair<string, int>("Li", 15)); student.insert(make_pair("Wang", 25)); student.insert(map<string, int>::value_type("xie", 30)); for (map<string,int>::iterator iter = student.begin(); iter != student.end(); iter++) { cout << (*iter).first << ":" << (*iter).second << endl; } } }; TEST(MapSTL, update) { MapSTL ms; ms.Update(); }
浙公网安备 33010602011771号