怀念夏天 发表于 前天 00:54

超具体介绍map(multimap)的利用

map类的介绍

        map的声明如下,Key是map底层关键字的类型,T是map底层value的类型。set默认要求Key支持小于比力,如果不支持大概必要的情况下我们可以自行传入仿函数,map底层存储数据的内存是从空间申请来的。一样寻常情况下,我们是不必要传后两个参数的。map的底层是由红黑树实现的,增删改查的效率是logN,迭代器遍历走的是中序,所以Key是有序排列的
        红黑树是平衡二叉搜索树
template < class Key,                                     // map::key_type
         class T,                                       // map::mapped_type
         class Compare = less<Key>,                     // map::key_compare
         class Alloc = allocator<pair<const Key,T> >    // map::allocator_type pair类型介绍

        红黑树的节点类型是pair类型,利用pair<Key,T>存储数据
typedef pair<const Key, T> value_type;
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)
{}

template<class U, class V>
pair (const pair<U,V>& pr): first(pr.first), second(pr.second)
{}
};
template <class T1,class T2>
inline pair<T1,T2> make_pair (T1 x, T2 y)
{
return ( pair<T1,T2>(x,y) );
}
map的增删查

#include<iostream>
#include<map>
using namespace std;

int main()
{
        map<string, string> m;

        //插入有名pair(方式一)
        pair<string, string> s("first", "第一个");
        m.insert(s);

        //插入无名piar(方式二)
        m.insert(pair<string, string>("second", "第二个"));

        //调用make_pair函数
        m.insert(make_pair("third", "第三个"));
        //make_pair函数,其功能为,将两个参数构造成一个pair并返回

        //隐式类型转化(c++11),可以看作将两个元素直接转化为pair
        m.insert({ "auto", "自动的" });

        // initializer_list构造
        map<string, string> dict = { {"left", "左边"}, {"right", "右边"},
{"insert", "插⼊"},{ "string", "字符串" } };

       
        //map的遍历
        //pair并没有重载流插入与流提取,故而下面的输出我们只能通过输出成员变量
        cout << "遍历一:" << endl;
        for (auto& e : m)
        {
                cout << e.first << "," << e.second << " ";
        }
        cout << endl;

        cout << "遍历二:" << endl;
        auto it = m.begin();
        while (it != m.end())
        {
                cout << it->first << "," <<it->second<< " ";
                it++;
        }
        cout << endl;


        //map的查找
        string str;
        cin >> str;
        auto pos = m.find(str);
        if (pos != m.end())
        {
                cout << "找到了:" << pos->first << "," << pos->second << endl;
        }
        else
        {
                cout << "不存在!"<<endl;
        }


        //map的删除
        cout << "删除一:" << endl;
        cin >> str;
        m.erase(str);
        for (auto& e : m)
        {
                cout << e.first << "," << e.second << " ";
        }
        cout << endl;

        cout << "删除二:" << endl;
        cin >> str;
        auto pos0 = m.find(str);
        m.erase(pos0);
        for (auto& e : m)
        {
                cout << e.first << "," << e.second << " ";
        }
        cout << endl;

        cout << "删除三:" << endl;
        //iteratorerase (const_iterator first, const_iterator last);
        //删除一段区间,给出左边迭代器和右边迭代器,函数将会删除这段区间,
        //一般搭配 lower_boundupper_bound 使用
}         
map的迭代器和[]功能

·        https://i-blog.csdnimg.cn/direct/161824e787a04f38910796d37ba44f58.png
        operator[]的功能:传入Key值会返回value值(传入pair的first,会返回pair的second)operator[]具有:插入、查找、修改的功能。必要注意的是,如果当传入的Key值本来就不存在map中时,这个值将会被插入map
        而operator[]之所以拥有这些功能与其底层(insert)的实现有关https://i-blog.csdnimg.cn/direct/6b732e78ddc840dcbac41c9d1b981e0a.png
        下面我们来仔细看看insert函数 
https://i-blog.csdnimg.cn/direct/977992d45e1a4cf5a4d3cacae7430dc6.png
        insert的返回值为一个pair:
        当map中没有这个元素,insert插入乐成并返回 pair<乐成插入位置的迭代器,true>
        反之当map中有这个元素,insert插入失败并返回  pair<已经存在的值的迭代器,false>
具体实例:
#include<iostream>
#include<map>
using namespace std;

int main()
{
        string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };// 使用正确汉字
        map<string, int> countMap;

        //普通统计水果数量的方式
        for (auto& e : arr)
        {
                auto pos=countMap.find(e);
                if (pos != countMap.end())
                {
                        pos->second++;
                }
                else
                {
                        countMap.insert({ e,1 });
                }
        }
        for (auto& e : countMap)
        {
                cout << e.first << "," << e.second<<" ";
        }
        cout << endl;


        //使用operator[]
        for (auto& e : arr)
        {
                countMap++;
        }
        //若e存在则插入失败,operator[]返回value,再让其+1
        //若e不存在则插入成功{e,0},operator[]返回value,再让其+1 》{e,1}
        for (auto& e : countMap)
        {
                cout << e.first << "," << e.second << " ";
        }
        cout << endl;
       
} #include<iostream>
#include<map>
using namespace std;

int main()
{
        map<string, string> dict;
        dict.insert(make_pair("sort", "排序"));

        // key不存在-> 插⼊ {"insert", string()}
        dict["insert"];

        // key不存在-> 插⼊+修改
        dict["left"] = "左边";

        // key已经存在-> 修改
        dict["left"] = "左边、剩余";

        // key存在->查找
        cout << dict["left"] << endl;
        return 0;
} multimap和map的差异

        multimap和map的使⽤根本完全类似,重要区别点在于multimap⽀持关键值key冗余,那么 insert/find/count/erase都围绕着⽀持关键值key冗余有所差异,这⾥跟set和multiset完全⼀样,⽐如 find时,有多个key,返回中序第⼀个。其次就是multimap不⽀持[],因为⽀持key冗余,[]就只能⽀ 持插⼊了,不能⽀持修改。 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 超具体介绍map(multimap)的利用