map容器(20221125)

一、map/multimap容器

1、map基本概念

map中所有元素都是pair;

pair第一个元素为key(键值),起到索引的作用,第二个元素为value(实值);

所有元素会根据元素的键值(key)自动排序。

map/multimap实质都属于关联式容器 底层结构为二叉树

优点:

可以根据key值快速找到value值

map/multimap区别:

map中不允许有重复的key值,multimap中可以有。

2、构造和赋值

map<T1,T2>mp; //默认构造

map(const map &mp); // 拷贝构造

map& operator=(const map&mp); //赋值重载=操作符

void printMap(map<string, int>&mp)

{

    for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++)

    {

        cout << "key = " << (*it).first << " value=" << (*it).second << endl;

    }

}



void test01()

{

    map<string,int>mp;

    mp.insert(pair<string, int>("张三", 19)); //插入时必须要先创建一个对组

    mp.insert(pair<string, int>("张四", 20)); //插入时必须要先创建一个对组

    mp.insert(pair<string, int>("张五", 21)); //插入时必须要先创建一个对组

    mp.insert(pair<string, int>("张六", 10)); //插入时必须要先创建一个对组

    printMap(mp);

    //拷贝构造

    map<string, int>mp1(mp);

    cout << "mp1:" << endl;

    printMap(mp1);



    //赋值

    map<string,int>mp2;

    mp2 = mp1;

    cout << "mp2:" << endl;

    printMap(mp2);

}

2、map的大小和交换

函数原型:

size();

empty();

swap(st);

用法与其它容器相同

3、map插入和删除

函数原型:

insert(elem);

clear();

erase(pos);

erase(beg,end);

erase(key); //删除容器中值为key的元素

用法与其他容器相同

void test02()

{

    map<string, int>mp2;

    mp2.insert(pair<string, int>("B", 19)); //插入时必须要先创建一个对组

    mp2.insert(pair<string, int>("C", 20)); //插入时必须要先创建一个对组

    mp2.insert(pair<string, int>("A", 21)); //插入时必须要先创建一个对组

    mp2.insert(pair<string, int>("D", 10)); //插入时必须要先创建一个对组

    mp2.insert(make_pair("E", 23));

    //第三种插入

    mp2.insert(map<string, int>::value_type("M", 20));

    //第四种插入

    mp2["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值value

    printMap(mp2);



    //删除

    cout << "删除第一个元素" << endl;

    mp2.erase(mp2.begin());

    printMap(mp2);

    cout << "删除key为M的元素" << endl;

    mp2.erase("M"); //按key的方式删除

    printMap(mp2);

    cout << "清空元素" << endl;

    mp2.clear();

    printMap(mp2);

}

5、map的查找与统计

find(key);//查找key是否存在,若存在 则返回元素的迭代器,不存在,则返回map.end();

count(key);//统计key的元素个数

用法与set的查找与统计相同。

void test03()

{

    map<string, int>mp2;

    mp2.insert(pair<string, int>("B", 19)); //插入时必须要先创建一个对组

    mp2.insert(pair<string, int>("C", 20)); //插入时必须要先创建一个对组

    mp2.insert(pair<string, int>("A", 21)); //插入时必须要先创建一个对组

    mp2.insert(pair<string, int>("D", 10)); //插入时必须要先创建一个对组

    mp2.insert(make_pair("E", 23));

    //第三种插入

    mp2.insert(map<string, int>::value_type("M", 20));

    //第四种插入

    mp2["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值value



    //查找

    map<string,int>::iterator pos = mp2.find("B");//返回的是迭代器 用迭代器接收

    if (pos != mp2.end())

    {

        cout << "元素存在,其实值为:"<< (*pos).second<< endl;

        cout << "其个数为: " << mp2.count("B") << endl;

    }

    else

    {

        cout << "元素不存在!" << endl;

    }

}

6、map容器的排序规则

class MyCompare {

public:

    bool operator()(string v1, string v2)const //重载()  需要加一个const 否则会报错

    {

        return v1 > v2;

    }

};



void test04()

{

    map<string, int>mp2;

    mp2.insert(pair<string, int>("B", 19)); //插入时必须要先创建一个对组

    mp2.insert(pair<string, int>("C", 20)); //插入时必须要先创建一个对组

    mp2.insert(pair<string, int>("A", 21)); //插入时必须要先创建一个对组

    mp2.insert(pair<string, int>("D", 10)); //插入时必须要先创建一个对组

    mp2.insert(make_pair("E", 23));

    mp2.insert(make_pair("E", 28));

    //第三种插入

    mp2.insert(map<string, int>::value_type("M", 20));

    //第四种插入

    mp2["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值value



    //查找

    map<string, int>::iterator pos = mp2.find("B");//返回的是迭代器 用迭代器接收

    if (pos != mp2.end())

    {

        cout << "元素存在,其实值为:" << (*pos).second << endl;

        cout << "其个数为: " << mp2.count("B") << endl;

    }

    else

    {

        cout << "元素不存在!" << endl;

    }

    cout << "默认排序为:" << endl;

    printMap(mp2);

    cout << "自己定义排序插入后:" << endl;



    map<string, int,MyCompare>mp3;

    mp3.insert(pair<string, int>("B", 19));

    mp3.insert(pair<string, int>("C", 20));

    mp3.insert(pair<string, int>("A", 21));

    mp3.insert(pair<string, int>("D", 10));

    mp3.insert(make_pair("E", 23));

    mp3.insert(make_pair("E", 28));

    mp3.insert(map<string, int>::value_type("M", 20));

    mp3["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值value

    for (map<string, int, MyCompare>::iterator it = mp3.begin(); it != mp3.end(); it++)

    {

        cout << "key为: " <<it->first << " value为:" << (*it).second << endl;

    }

}

也可以不用定义MyCompare类,直接用greater<string> ,其中string表示比较string的大小

    map<string, int,greater<string>>mp3;

    mp3.insert(pair<string, int>("B", 19));

    mp3.insert(pair<string, int>("C", 20));

    mp3.insert(pair<string, int>("A", 21));

    mp3.insert(pair<string, int>("D", 10));

    mp3.insert(make_pair("E", 23));

    mp3.insert(make_pair("E", 28));

    mp3.insert(map<string, int>::value_type("M", 20));

    mp3["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值value

    for (map<string, int>::iterator it = mp3.begin(); it != mp3.end(); it++)

    {

        cout << "key为: " <<it->first << " value为:" << (*it).second << endl;

}

注意map容器只能通过键值大小来进行排序,不能通过实值的大小来进行排序,若需要通过实值大小排序,可以转为其他容器来实现,如vecter, vecter<pair<int,int>>。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值