C++ STL map和multimap最全入门

map和multimap提供了操作<键,值>对的方法,存储一对对象,即键对象和值对象,键对象是用于查找过程中的键,值是与键对应的附加数据。例如,若键是单词,对应的值是表示单词在文档中出现次数的数字,这样的map就成了统计单词在文本中出现次数的频数表;map中的元素不允许重复,而multimap中的元素允许重复。

虽然set/multiset集合中的元素只包括键,而map映射中的元素则由<键,值>对构成,但map/multimap

提供的操作也是针对各元素中的键进行的,其操作方法与set集合操作键的方法相同。前面介绍的set/multiset集合的操作方法同样适用于map/multimap,包括集合的建立方法,成员函数,比较运算,排序规则和方法等,只需要将其中的set改为map,将multiset更改为multimap。因此,这里只对map/multimap集合的insert成员函数及元素的访问方法作两点补充说明:
 

(1)关于insert成员函数

插入到map/multimap和set/multiset的元素是有区别的,插入到set/multiset中的元素是单独的键,而插入到map/multimap中的元素是<键,值>对构成的一对数据,这对数据是一个不可分割的整体,需要用make_pair成员函数构造:
  make_pair(k,v)    //其中k代表键,v代表值

(2)关于map/multimap元素访问

map/multimap类型的迭代器提供了两个数据成员:一个是first,用于访问键;另一个是second,用于访问值。  此外,map类型的映射可以用键作为数组下标,访问该键所对应的值,但multimap类型的映射不允许使用数组下标的方式访问其中的元素。

关于map的简例:
 

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string name[]={"花木兰","澜","上官婉儿"};
    string pos[]={"战士","刺客","法师"};
    map<string,string,greater<string>> wzry;  //默认的话就是less
    map<string,string>::iterator p;
    for(int i=0;i<3;i++)
        wzry.insert(make_pair(name[i],pos[i]));
    wzry["牛魔"]="坦克";
    wzry["吕布"]="战士";
    for(p=wzry.begin();p!=wzry.end();p++)
        cout<<p->first<<" "<<p->second<<endl;
    string person;
    cout<<"输入查找英雄的姓名:";
    cin>>person;
    for(p=wzry.begin();p!=wzry.end();p++)
        if(p->first==person)
          cout<<p->second<<endl;
    return 0;
}

输出结果:
 

上官婉儿 法师
牛魔 坦克
吕布 战士
澜 刺客
花木兰 战士
输入查找英雄的姓名:花木兰
战士

multimap和map的用法基本相同,区别在于,map映射中的键不允许重复,而multimap中的键是允许重复的。此外,map允许用数组的下标运算访问映射中的值,而multimap是不允许的,multimap在构造一键对多值的查询时非常有用。

关于multimap的简例:
 

#include<bits/stdc++.h>
using namespace std;

int main()
{
    multimap<string,string> dict;
    multimap<string,string>::iterator p;
    string eng[]={"cliff","berg","precipice","tract"};
    string che[]={"悬崖","冰山","悬崖","一片,区域"};
    for(int i=0;i<4;i++)
        dict.insert(make_pair(eng[i],che[i]));
    //插入单个元素
    dict.insert(make_pair(string("tract"),string("地带")));
    dict.insert(make_pair(string("precipice"),string("危险的处境")));
    dict.insert(make_pair("day","一天"));  //正确
    //dict["precipice"]="悬崖,峭壁";   错误
    for(p=dict.begin();p!=dict.end();p++)
        cout<<p->first<<" "<<p->second<<endl;
    string word;
    cout<<"请输入要查找的英文单词: ";
    cin>>word;
    for(p=dict.begin();p!=dict.end();p++)
        if(p->second==word)
          cout<<p->first<<endl;
    return 0;
}

输出结果:
 

berg 冰山
cliff 悬崖
day 一天
precipice 悬崖
precipice 危险的处境
tract 一片,区域
tract 地带
请输入要查找的英文单词: 悬崖
cliff
precipice

HDU 1263

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;cin>>n;
    while(n--)
    {
        int m,k; cin>>m;
        string s1,s2;
        map<string,map<string,int>> p;  //第一个string是s2,第二个string是s1
        map<string,int> q;
        for(int i=0;i<m;i++)
        {
            cin>>s1>>s2>>k;
            p[s2][s1]+=k;
        }
        for(auto it:p)
        {
            cout<<it.first<<endl;
            q=it.second;
            for(auto itt:q)
            {
                cout<<"   |----"<<itt.first<<"("<<itt.second<<")"<<endl;
            }
        }
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值