stl库之map与例题

2023-12-13 09:38:20

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;
}

文章来源:https://blog.csdn.net/qq_72583325/article/details/134862608
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。