map是一种关联式容器,它允许将键(key)映射到值(value),所以我们习惯称map为映射
每个元素都是一个键值对,其中键是唯一的
创建map
map<key类型, value类型> 变量名;
创建一个键为int,值为string的map
map<int, string> a;
插入元素
a[1] = "第一个字符串";
a[28] = "第二个字符串";
a[2] = "第二个字符串";
a[4] = "第二个字符串";
我们这里是无序插入的,但实际上map自动替我们排了序,在后面遍历map的时候可以看出
访问元素
string str = a[1];
或者
string str2 = a.at(2);
查看元素是否存在(查看的是键值)
返回bool类型
a.count(1);
删除元素(key)
a.erase(1);
遍历(迭代器)
map<int, string>::iterator it;
for (it = a.begin(); it != a.end(); it++) {
cout << "键:" << it->first << "\t";
cout << "值:" << it->second;
cout << endl;
}
输出:
可以看出map确实替我们排了序
入门题目:hdu 2648 shopping
解题代码来源于《算法竞赛:入门到进阶》
问题描述
每个女孩都喜欢购物,蒲公英也是如此。现在她发现店里每天都在涨价,因为春节快到了。她喜欢一家名为“memory”的商店。现在她想知道这家店的价格在每天变化后排名如何。
输入
一行连数n(n<=10000),代表商店数量。
然后是n行,每行包含一个字符串(长度小于31,只包含小写字母和大写字母)。代表商店的名称。
然后一行是数字 m (1<=m<=50),代表天数。
然后 m 个部分,每部分有 n 行,每行是数字 s 和一个字符串 p,代表这一天,商店 p 的价格上涨了 s。
输出
包含m行,在第i行中打印第i天后商店“memory”的排名。我们将排名定义为:如果有t家商店的价格高于“记忆”,则其排名为t+1。
示例输入
3
memory
kfc
wind
2
49 memory
49 kfc
48 wind
80 kfc
85 wind
83 memory
示例输出
1
2
解题思路:本体的解题关键是如何处理排序,如果我们考虑数组,向量的话,如果两个数还好说,三个四个数就显然没办法用这种数据结构。这时,我们考虑使用键值对,来映射商店-价格的关系。然后从头遍历map,如果价格高于“memory”就把一个既定的值+1
#include <bits/stdc++.h>
using namespace std;
int main() {
//n是商店数
int n, m, p;
//shop存放所有商店-价格的映射关系
map<string, int> shop;
while (cin >> n) {
string s;
//个人认为,这一句是为了消化输入的商店名,其实对程序没啥用,但是不得不写
for (int i = 1; i <= n; i++) {
cin >> s;
}
//m代表天数
cin >> m;
while (m--) {
for (int i = 1; i <= n; i++) {
cin >> p >> s;
shop[s] += p;
}
//rank就是排的位置
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;
}