欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C++】【总结】unordered_map,unordered_set,map和set的用法和区别

程序员文章站 2022-03-23 14:01:25
...

转载出处:https://blog.csdn.net/zjajgyy/article/details/65935473

通过代码来区别

unordered_map和map
unordered_map存储机制是哈希表,,即unordered_map内部元素是无序的。

map是红黑树,map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。

unordered_set和set
unordered_set基于哈希表,是无序的。
set实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。

平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。

通用数据:

vector<int> list;
    list.push_back(5);
    list.push_back(14);
    list.push_back(34);
    list.push_back(22);
    list.push_back(39);
    list.push_back(5);

unordered_map

头文件:#include<unordered_map>

介绍:std::unordered_map 就是以key来查找value而设计,不会根据key排序。

代码:

unordered_map<int, int> map;
        for (int i=0; i<list.size(); i++){
            map[i] = list[i];
        }
        cout << map[0] << endl;
        for (unordered_map<int, int>::iterator i = map.begin(); i != map.end(); i++){
            cout << i->first << ' ' << i->second << endl;
        }
        if (map.find(3) != map.end()) {
            cout << "find key=" << map.find(3)->first << ", value=" << map.find(3)->second << endl;
        }
        if (map.count(5) > 0) {
            cout << "find 5: " << map.count(5) << endl;
        }

结果:
UnorderedMap

5
5 5
4 39
3 22
2 34
1 14
0 5
find key=3, value=22
find 5: 1

==============================================
m.count(n)计算下标为n的位置有无数据,有返回1,无返回0。

==============================================
unordered_map也有find方法,得到的对象是一个iterator

unordered_set

头文件:#include<unordered_set>

介绍:std::unordered_set 是基于hash表的,因此并不是顺序存储。

代码:

       unordered_set<int> set;
        for (int i=0; i<list.size(); i++){
            set.insert(list[i]);
        }
        for (unordered_set<int>::iterator i = set.begin(); i != set.end(); i++) {
            cout << *i << endl;
        }
        cout << " find 39: " << *set.find(39) << endl;
        cout << "count 14:" << set.count(5) << endl;

结果:

UnorderdSet
22
39
34
14
5
 find 39: 39
count 14:1

map

头文件:#include

介绍:std::map 就是以key来查找value而设计,根据key排序。

代码:

map<int, int> map1;
        for (int i=0; i<list.size(); i++){
            map1[i] = list[i];
        }
        for (map<int, int>::iterator i = map1.begin(); i != map1.end(); i++){
            cout << i->first << ' ' << i->second << endl;
        }
        if (map1.find(3) != map1.end()) {
            cout << "find key=" << map1.find(3)->first << ", value=" << map1.find(3)->second << endl;
        }
        if (map1.count(5) > 0) {
            cout << "count 5: " << map1.count(5) << endl;
        }

结果:

Map
0 5
1 14
2 34
3 22
4 39
5 5
find key=3, value=22
count 5: 1

set
头文件:#include
介绍:std::set 是基于hash表的,因此并不是顺序存储。
代码:

        set<int> set;
        for (int i=0; i<list.size(); i++){
            set.insert(list[i]);
        }
        for (auto i = set.begin(); i != set.end(); i++) {
            cout << *i << endl;
        }
        cout << *set.find(5) << endl;
        cout << set.count(5) << endl;

结果:

Set
5
14
22
34
39
5
1

————————————————
版权声明:本文为CSDN博主「zjajgyy」的原创文章,遵循CC 4.0 BY-SA版权协议。
原文链接:https://blog.csdn.net/zjajgyy/article/details/65935473