我是靠谱客的博主 忧郁猎豹,最近开发中收集的这篇文章主要介绍C++ unordered_set nuordered_map map multiset multimap的使用unotdered_set:unordered_map:set:Map:multiset:multimap:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

       map和set机制可以说是C++庞大体系中非常重要的一部分,作为比较高级的C++特性,虽然非常方便使用,但是对于初学者而言,还是会存在很多困惑的,今天在这里就自己的一点心得来share。

       map和set主要的作用在于查找的时候比较方便,因为是内部hash映射的关系,建立表的时候用时间较长,但是建立好之后,查找的速度是固定的,并不会随着元素的增加而增大,因此,使用map和set的时间复杂度是O(1),因此该特性对于写出比较高效的程序而言是非常重要的,我们就来具体介绍一下。

       如果仅仅只是查找,最常用到的是unordered_set和unordered_map两个特性,因为他们不进行排序,所以,构造时间相对比较短,而且这两个结构有一个特性是从前向后插入,用unodered_set举个例子,当插入的元素顺序是 1,2,3,4,相应的输出顺序是4,3,2,1 。而且重复元素以第一个输入的为准,例如:

unotdered_set:

    unordered_set<int> unSet;

    unSet.insert(2);
    unSet.insert(1);
    unSet.insert(3);
    unSet.insert(2);
    unSet.insert(0);
    unSet.insert(3);

    for(auto& an : unSet){
        cout << an << "  ";
    }
    cout << endl;

对应的输出为:

此外,除了知道如何向unordered_set中输入元素,从unordered_set中输出元素,还要知道最重要的查找功能,一般而言,要知道某一个元素在不在set中,常用的两个函数是count(),和find()。count一般是返回元素的个数,在unordered_set里面返回的是0或者1,find是元素所在的地址,只要不返回end()的值,就说明存在该元素。

    int k=0;
    if(unSet.count(k)){
        cout << "The set have the element" << endl;
    }
    
    if(unSet.find(k) != unSet.end()){
        cout << "The set have the element" << endl;
    }

unordered_map:

unordered_map的特性也是类似的,值得注意的是,unordered_map是存放一对儿元素,一个是key值,另一个是val值,就类似于我们数组中索引和数据值的关系,所有的操作都是要先找到索引在找到数值。所以,查找的函数都是针对索引来做的。具体的可以通过代码来体会。

    unordered_map<int, int> unMap;
    unMap.insert(make_pair(2, 1));
    unMap.insert(make_pair(1, 3));
    unMap.insert(make_pair(3, 7));
    unMap.insert(make_pair(2, 0));
    unMap.insert(make_pair(0, 1));
    unMap.insert(make_pair(3, 2));

    for(auto& an : unMap){
        cout << an.first << "  " << an.second << endl;
    }

    if(unMap.count(3)){
        cout << "The Map have the element" << endl;
    }
    if(unMap.find(3) != unMap.end()){
        cout << "The Map have the element" << endl;
    }

当然,如果要输出也可以使用iterator

    unordered_map<int, int>::iterator iter;
    iter = unMap.begin();
    for(int i=0; i<unMap.size(); i++){
        cout << iter->first << "  " << iter->second << endl;
    }

输出为:

依然是倒序,然后同样的key值,先进入的有效。

set:

set相比较nuordered_set多的特性是可以自动排序,具体的作用场景是,当要打印出大于某一个数的所有其他数值,可以先找到该数值在set中对应的地址,然后,将后续的元素全部打印出来,(注:set的排序顺序是从小到大)具体可以在代码中体会。

set<int> isSet;
isSet.insert(2);
isSet.insert(1);
isSet.insert(3);
isSet.insert(2);
isSet.insert(0);
isSet.insert(3);

for(auto& an : isSet){
    cout << an << "  ";
}
cout << endl;

输出结构:

从输出结果可以看出,已经具备自动排序的功能,而且是从小达到排列。至于count和find函数的运用是类似的。
 

Map:

与unordered_map几乎是一样的,但是,区别在于可以总动排序,当然,是一句key值进行排序,其他包括find()和count()函数相同的。

    map<int, int> isMap;
    isMap.insert(make_pair(2, 1));
    isMap.insert(make_pair(1, 3));
    isMap.insert(make_pair(3, 3));
    isMap.insert(make_pair(2, 0));
    isMap.insert(make_pair(0, 1));
    isMap.insert(make_pair(3, 2));

    for(auto& an : isMap){
        cout << an.first << "  " << an.second << endl;
    }

输出结果:

而且也可以看出,同样的key值,先进入的占据有效位置,后进入的为无效。而且可以依据key值自动排序。

multiset:

刚刚提到的上述4中结构,key值是唯一的,也就是说,相同的key值我输入进去就会是的后输入的无效,这就使得在某些场景下不是很实用,因此,multimap的作用就是多个具有相同的key值存在,而且自从按顺序排列。

    multiset<int> ismultiSet; 
    ismultiSet.insert(2);
    ismultiSet.insert(1);
    ismultiSet.insert(3);
    ismultiSet.insert(2);
    ismultiSet.insert(0);
    ismultiSet.insert(3);

    for (auto& an : ismultiSet) {
        cout << an << "  ";
    }
    cout << endl;

输出结果:

multimap:

直接上代码自己体会一下就好了 ,值得注意的是,在multiset和multimap两种结构下,find()函数返回的值是第一个key值为目标值的数,count()函数返回的是所有符合条件的key值的个数。

    multimap<int, int> ismultiMap;
    ismultiMap.insert(make_pair(2, 1));
    ismultiMap.insert(make_pair(1, 3));
    ismultiMap.insert(make_pair(3, 3));
    ismultiMap.insert(make_pair(2, 0));
    ismultiMap.insert(make_pair(0, 1));
    ismultiMap.insert(make_pair(3, 2));

    for(auto& an : ismultiMap){
        cout << an.first << "  " << an.second << endl;
    }

 

最后

以上就是忧郁猎豹为你收集整理的C++ unordered_set nuordered_map map multiset multimap的使用unotdered_set:unordered_map:set:Map:multiset:multimap:的全部内容,希望文章能够帮你解决C++ unordered_set nuordered_map map multiset multimap的使用unotdered_set:unordered_map:set:Map:multiset:multimap:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部