当前位置 博文首页 > 我爱编程:map & multimap转载

    我爱编程:map & multimap转载

    作者:[db:作者] 时间:2021-07-02 18:28

    一、map的文档总结
    

    1、map是关联式容器,它按照key值比较存储,默认是小于;

    2、在map中,键值key通常用于唯一的标识元素,而值value中存储与此键值key关联的内容;键值key和value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名为pair;

    3、map中的元素是键值对;

    4、map中的key是唯一的,并且不能修改,遇到重复的key就会插入失败;但可以利用operator[]对value进行修改;

    5、map的底层实现为红黑树,查找效率比较高,是O(logN);

    二、关于键值对pair

    STL中对于键值对的定义:

    template <class T1,class T2>
    struct pair
    {
    typedef T1 first_type;
    typedef T2 second_type;

    T1 first;
    T2 second;
    
    pair()
    	: first(T1())
    	, second(T2())
    {}
    pair(const T1&a, const T2&b)
    	: first(a)
    	, second(b)
    {}
    

    };
    三、map的重要接口

    1、insert

    下面是这两种插入方式的返回值的解释:

    下面介绍一下insert的使用

    int main()
    {
    map<string, string> m;
    //map底层是键值对的形式存储,所以在插入的时候要构造键值对
    m.insert(pair<string,string>(“apple”, “苹果”));
    m.insert(make_pair(“apple”, “苹果”));
    m.insert(make_pair(“banana”, “香蕉”));
    m.insert(make_pair(“banana”, “香蕉”));
    m.insert(make_pair(“peach”, “桃子”));
    map<string, string>::iterator it = m.begin();
    //m.insert(it, make_pair(“apple”, “苹果”));
    while (it != m.end())
    {
    //*it取到pair,pair里面存的是键值对,然后再用.访问它里面的first和second
    //cout << (*it).first << “:” << (*it).second << endl;
    //(.)是结构体成员变量访问成员函数,(->)是结构体指针访问成员
    //pair是一个结构体指针
    cout << it->first << “:” << it->second << endl;
    ++it;
    }
    cout << endl;
    system(“pause”);
    return 0;
    }
    输出结果:

    可以看出在插入的时候,map进行了排序和去重。

    2、删除erase

    删除键值为“?x?”的元素,以上述代码为例,删除键值为”apple“的元素

    m.erase(“apple”);
    3、交换swap

    map的底层是一个平衡搜索树(?红黑树),所以交换的时候只用交换根节点即可。

    利用上述插入代码,交换strs和m;

    map<string, string> strs;
    strs.insert(make_pair("apple", "aaa"));
    strs.insert(make_pair("banana", "bbb"));
    strs.insert(make_pair("banana", "xxx"));
    strs.insert(make_pair("peach", "ppp"));
    m.swap(strs);
    

    输出结果:

    4、find? ? 查找键值为“X”的元素

    返回值:

    5、map的重点? ? ?operator[ ]

    根据文档可看出,operator[ ] 插入的是key,返回的是与key对应的value。

    先看一段代码:

    mapped_type& operator[](const key_type& k)
    {
    return (*((this->insert(make_pair(k, mapped_type()))).first)).second;
    }
    可以看出operator[ ] 中用到了插入函数,下面我们来分析一下这段让各位童鞋头疼的代码:

    需要注意的是,当key存在时,找到与key对应的value,然后返回其引用;

    当key不存在时,operator[ ]用默认value与key构造键值对然后插入,返回该默认的value。

    6、operator[ ]支持元素的存取
    map/multimap和set/multiset都是关联式容器,不支持对元素的直接存取,通过迭代器进行,但是map有个例外,利用operator[ ]直接存元素,并且下标不一定是整型,可以是任意类型,这种接口视为关联式数组。

    并且,利用这种方式插入元素不存在数组越界的情况,如果使用一个可以作为索引,而该key尚不存在map中,map会重载operator[]插入新元素,新元素的value值由构造函数确定,一般为0.

    例如:

    m[“orange”] = “橘子”;
    会经历如下操作:

    处理? m[“orange”]

    如果map中存在键值”orange“的元素,则返回该元素的引用;

    如果不存在,则自动创建值为“orange”的元素,key所对应的value由默认的构造函数赋值。

    处理m[“orange”] = “橘子”

    橘子通过赋值操作赋值给新诞生的元素“orange”。

    结合insert的代码,输出结果为:

    使用下标操作符接口,map的插入更加便捷,但该方式在效率上,同其他安插方式相比较慢一些。

    四、multimap基本用法

    multimap和map的功能类似,就不一一介绍了,下面主要说一下这两者的不同:

    1、multimap中的key可以重复

    2、multimap中没有重载operator[ ]功能

    3、对于重复的元素,查找的时候也是返回中序遍历的第一个元素,至于为什么,前面讲set的时候已经介绍过了,若不理解,课参考这篇博客:https://blog.csdn.net/yam_sunshine/article/details/89340462
    ————————————————
    版权声明:本文为CSDN博主「yam_sunshine」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yam_sunshine/article/details/89930311

    cs
    下一篇:没有了