map:
- 关联容器,实现从键(key)到值(value)的映射。
- map效率高的原因:用平衡二叉搜索树来存储和访问。
一个常见问题
- 有n个学生,每人有姓名name和学号id。
- 给定一个学生的name,要求查找他的id。
- 简单的做法是:
- 定义string name[n]和int id[n](可以放在一个结构体中)存储信息,
- 然后在name[]中查找这个学生,找到后输出他的id。
- 这样做的缺点是,需要搜索所有的name[],复杂度是O(n),效率很低。
- 利用STL中的map容器,可以快速地实现这个查找,复杂度是O(logn)。
- 用map实现:
- (1)定义:map<string, int> student,存储学生的name和id。
- (2)赋值:例如student[“Tom”] = 15。这里把”Tom”当成普通数组的下标来使用。
- (3)查找:找学号时,直接用student[“Tom”]表示他的id,不用再去搜索所有的姓名
例:hdu 2648 Shopping
- 题意:
- 女孩dandelion经常去购物,她特别喜欢一家叫“memory”的商店。
- 由于春节快到了,所有商店的价格每天都在上涨。她想知道这家商店每天的价格排名。
- Input:
- 第一行是数字n(n <= 10000),代表商店的数量。 后面n行,每行有一个字符串
- (长度小于31,只包含小写字母和大写字母)表示商店的名称。 然后一行是数字m(1 <= m <= 50),
- 表示天数。 后面有m部分,每部分有n行,每行是数字s和一个字符串p,表示商店p在这一天涨价s。
- Output:
- 包含m行,第i行显示第i天后店铺“memory”的排名。排名的定义为:
- 如果有t个商店的价格高于“memory”,那么它的排名是t + 1。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m, p;
map<string, int> shop;
while(cin>>n)
{
string s;
for(int i=1; i<=n; i++) cin>>s; //输入商店名字。实际上用不着处理
cin >> m;
while(m--)
{
for(int i=1; i<=n; i++)
{
cin >> p >> s;
shop[s] += p; //用map可以直接操作商店,加上价格
}
int rank = 1;
map<string,int>::iterator it; //迭代器
for(it=shop.begin(); it != shop.end(); it++)
if(it->second > shop["memory"]) //比较价格
rank++;
cout<<rank<<endl;
}
shop.clear();
}
return 0;
}