map是STL的一个关联容器,它提供一对一的数据处理能力. 也就是内部存储的有两个部分,一个是固定的键值(从开始插入后就不
会再改变的值)也可以称为关键字另外一个是记录该关键字的状态(大小,翻译,对应关系).所以map的作用很广泛,生活中一一对
应的东西太多了,比如你的身份证号和你,比如你需要记录很多不同东西的数量,还有很多很多. 而且map还是有序的.应用场景相
当广泛. 但是map也是有不能存储的数据 只要该数据不能够互相比较大小那么就不能使用map存储. 那么为什么呢?
这里是由于map容器底层是使用搜索树来存储数据的,所以你在构建搜索树的时候需要不停的比较大小,这就是原因.而这里使用的搜
索树是较为成熟的红黑树,正因为底层是红黑色所以map的查找,删除,插入的效率都很高。
上面的看不懂也没关系,具体来讲一讲怎么使用这个容器
这是天梯赛练习题里的一道题
https://pintia.cn/problem-sets/994805046380707840/problems/994805130426171392
L1-011 A-B (20 分)
本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It's a fun game!
aeiou
输出样例:
I lv GPLT! It's fn gm!
拿到这个题目我第一时间想到的做法是將字符串B中的每个字符与字符串A中的每个字符进行比较,若一致则删去字符串A中的字
符。但是每个字符串的长度都能达到数百位,最坏的情况下我们可能需要进行一百万次的比较,时间复杂度为O(n^2).
而使用map容器可以大大降低时间复杂度,原因上面已经说过了
AC代码如下
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<char,int> mp;
string A,B;
getline(cin,A);
getline(cin,B);
int l1=A.size();
int l2=B.size();
for(int i=0;i<l2;i++)//将B映射
mp[B[i]]++;
for(int i=0;i<=l1;i++)
if(!mp[A[i]])
printf("%c",A[i]);
printf("\n");
return 0;
}