C++中map用法

一、头文件

#include<map>

map是一种以键--值(key-value)存储的数据类型

map中的数据默认按照key的值从小到大排序,value若为Int类型,默认为0

map不允许容器中有重复key值元素。

multimap允许容器中有重复key值元素

二,定义

构造函数原型:

map<T1,T2> m;//默认构造函数
map(const map &m);//拷贝构造函数

map& operator=(const map &m);//重载等号操作符

示例如下:

1)map<int,string> m;//定义了一个空的对象m

2)map<string,vector<string>> m;//

3)map<int,int> m;
map<int,int> m2=m;

三、常用操作


1)插入元素

常用的插入方式是m[key]=value;

如果是map<int,vector<int>> m;

可以使用m[key]={0,1,2};//这种方式

示例如下:

   map<int,int> m1;
   m1.insert({1,10});
   m1.insert({2,20});
   m1.insert({3,30});
   m1.insert({4,40});

   m1[5]=50;
   m1[6]=60;

2)删除

erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(begin,end);//删除区间[begin,end)的元素,返回下一个元素的迭代器
erase(key);//删除容器中值为key的元素
clear();//删除所有元素

示例如下:

   map<int,int> m1;
   m1.insert({1,10});
   m1.insert({2,20});
   m1.insert({3,30});
   m1.insert({4,40});

   m1[5]=50;
   m1[6]=60;

   m1.erase(m1.begin());//0,20,30,40,50,60

   auto it=m1.find(3);
   m1.erase(m1.begin(),it);//0,0,30,40,50,60

   m1.clear();//删除所有元素

3)查找和统计

find(val);//查找val是否存在,若存在,返回该键的迭代器,不存在,返回m.end();
count(val);//统计val的个数
 map<int,int> m1;
   m1.insert({1,10});
   m1.insert({2,20});
   m1.insert({3,30});
   m1.insert({4,40});
   m1[5]=50;
   m1[6]=60;
   
   auto it=m1.find(3);
   cout<<it->first<<" "<<it->second<<endl;//3,20

   cout<<m1.count(3)<<endl;//1

4)遍历

设map<int,int> m

则遍历如下:

map<int,int>::iterator iter=m.begin();
while(iter!=m.end())
{
cout<<iter->first<<" "<<iter->second<<endl;//输出
iter++;
}

使用auto遍历

for(auto iter=m.begin();iter!=m.end();iter++)
{
    cout<<iter->first<<" "<<iter->second<<endl;
}

for(auto &v:m)
{
    cout<<v->first<<v.second<<endl;
}

map<int,vector<int>> m;

使用auto遍历

for(auto &[_,v]:m)
  {
    cout<<v[0]<<endl;
    cout<<v[1]<<endl;
    //可以对vector进行操作
  }

5)大小与交换

size();//返回容器中的元素数目
empty();//判断容器是否为空
swap(m2);//交换2个容器的元素

示例如下:

map<int,int> m1;
   m1.insert({1,10});
   m1.insert({2,20});
   m1.insert({3,30});
   m1.insert({4,40});

   cout<<m1.size()<<endl;//4
   cout<<m1.empty()<<endl;//0

   map<int,int> m2;
   m2.insert({6,10});
   m2.insert({7,30});
   m2.swap(m1);

6)排序

map默认按照key值从小到大排序,可以利用仿函数改变排序规则

第一种方式:使用仿函数

示例1:使用内置数据类型

class compare
{
public:
   bool operator()(int v1,int v2)
   {
      return v1>v2;
   }
};

map<int,int,compare> m1;
m1.insert({1,10});
m1.insert({2,20});
m1.insert({3,30});

for(auto it=m1.begin();it!=m.end();it++)
   cout<<it->first<<" "<<it->second<<endl;

//输出3,30   2,20   1, 10

示例2:使用自定义数据类型

class student{

public:
    int age;
    string name;
    student(int ag,string nam)
    {
        age=ag;
        name=nam;
    }
};

class compare
{
public:
    bool operator()(const student& s1,const student& s2) const
    {
        return s1.age>s2.age;
    }
};

int main()
{
   map<student,char,compare> m1;
   student t1(1,"h1");
   student t2(2,"h2");
   student t3(3,"h3");
   m1[t1]='a';
   m1.insert({t2,'b'});
   m1.insert({t3,'c'});

   for(auto it=m1.begin();it!=m1.end();it++)
       cout<<it->first.age<<" "<<it->first.name<<" "<<it->second<<endl;

    return 0;
}

输出为:

3 h3 c
2 h2 b
1 h1 a

注意:自定义排序规则时,无论是传递参数,还是整个函数的const都必须写上

第二种方式:重载operator<()操作符

直接在定义类中重载operator<()操作符。

示例如下:

class student{

public:
    int age;
    string name;
    student(int age,string name)
    {
        this->age=age;
        this->name=name;
    }

    bool operator<(const student &s) const
    {
        return age>s.age;
    }
};

int main()
{
   map<student,char> m1;
   student t1(1,"h1");
   student t2(2,"h2");
   student t3(3,"h3");
   m1[t1]='a';
   m1.insert({t2,'b'});
   m1.insert({t3,'c'});

   for(auto it=m1.begin();it!=m1.end();it++)
       cout<<it->first.age<<" "<<it->first.name<<" "<<it->second<<endl;

    return 0;
}

输出为:

3 h3 c
2 h2 b
1 h1 a

自定义排序规则还有几种方式,可以额外了解一下。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值