STL—map(映照容器)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dark_cy/article/details/84872523

概述

  map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据具有一对一的映照关系,且键值具有唯一性,不能重复出现。所以,我们可以将map看作是由键值标识元素的元素集合(猛地一看是不是跟数组用下标来识别元素差不多...)。
  map可以通过一个键值来快速决定一个元素,因此非常适合于需要按照键值查找元素的容器。
  由于map的数据结构和set一样都是采用红黑树来实现的,所以它也具有根据键值将元素自动排序的功能。其用法也与 set 基本相似。

下面我们来简单介绍一下map的用法

头文件

#include<map>

:map 和 multimap 都包含在这个头文件里面,而且两者的用法基本一样。由于 multimap 可以插入相同的键值,所以它的插入、删除、查找会和map有所区别,其他操作就基本一样了。

定义对象

map<string,int> mp;
multimap<string,int> mmp;定义了一个键值类型为string,映照数据类型为int的map/multimap对象

:尖括号里的两种类型需用逗号隔开,不可以用空格。

插入元素

//map对象插入元素
mp["str"]=n;                  //用下标运算符插入
mp.insert("str",n)            //用insert插入元素,
//multimap对象插入元素
mmp.insert(pair<string,int>("str",n));//区别就是需要用到pari(),

:上面的插入过程中,"str"为键值,n为映照数据。map会自动根据键值对元素排序,默认为升序。当然也可以自定义比较规则(下面会有介绍)。

删除和清空元素

erase(it);           //通过迭代器删除指定对象
erase(it_1,it_2)     //删除一个迭代器区间的所有元素,区间左闭右开
//上面两种方式会返回指向下一元素的迭代器
erase("str");        //删除给定键值的元素,并返回删除的个数
clear()              //清空元素

:返回元素个数这个功能用在multimap比较有意义。

元素的遍历

mp<string,int>::iterator it;      //定义一个迭代器
for(it=mp.begin();it!=mp.end();it++)
{
    cout<<(*it).first<<" "<<(*it).second<<endl;
}

:需要注意的就是这里需要用到first(代表键值)和second(代表映照数据),而且他们两个后面不能跟小括号,如:(*it).first(),这是错误的!另,反向遍历需要用到reverse_iterator、rbegin()和rend()

元素查找

find();       //找到则返回指定该键值的迭代器,否则返回end()
count();      //返回指定键值出现的次数
count_if();   //在序列中统计与某谓词匹配(满足某种条件)的次数
upper_bound();//返回键值大于给定键值的第一个位置,是一个迭代器
lower_bound();//返回第一个大于或等于给定键值的元素的迭代器

:map用find()搜索元素的速度是极快的!在multimap中,由于存在相同键值,所以find()就返回重复键值中第一个元素的迭代器。

自定义比较函数

分为结构体和非结构体的情况

//非结构体
struct comp
{
    bool operator () (const int &a,const int &b)//键值为int型
    {
        return a>b;//大顶堆,降序排
    }
};
引用方法:map<string,int,comp> mp;
//结构体
struct lei
{
    string str;
    int score;
    bool operator < (const lei &a)const
    {
        return a.score<score;
    }
};
引用方法:map<lei int> mp;

map用于数字分离

代码示例
:有些编译器(如vc++6.0)编译下列代码时会出现4786警告,该警告并不影响结果。可以用#pragma warning(disable:4786)语句来强制忽略4786警告

#pragma warning(disable:4786)
#include<string>
#include<map>
#include<iostream>
using namespace std;
int main()
{
    map<char,int> m;
    for(int i=0;i<10;i++)
    {
     m['0'+i]=i;
    }
    string str="6234";
    int sum=0;
    for(int j=0;j<str.size();j++)
    {
     sum+=m[str[j]];
    }
    cout<<"sum = "<<sum<<endl;
    return 0;
}

输出如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/dark_cy/article/details/84872523