【常用技巧】标准模板库(STL)
在前几个章节中我们已经使用了诸如队列、堆、堆栈、vector 等标准模板库中的模板,切身感受到了它给我们带来的极大便利。在本节中,我们还要介绍两种标准模板——string 和 map,了解他们又会给我们带来怎样的便利。
string 对象,顾名思义即用来保存和处理字符串的标准模板。我们介绍其相关的操作。
例 8.1 字符串的查找删除
时间限制:1 秒 内存限制:32 兆
题目描述
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入
输入只有 1 组数据。 输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。
样例输入
in #include int main() { printf(" Hi "); }
样例输出
#clude tma() { prtf("Hi"); }
注:将字符串中的 In、IN、iN、in 删除。
解题代码
#include<cstdio> #include<string> #include<iostream> #include<ctype.h> using namespace std; int main() { char str[101]; gets(str);//输入短字符串 string a = str;//将其保存在a中 for (int i = 0; i < a.size(); i++)a[i] = tolower(a[i]);//将a中的字符全部改成小写 while (gets(str))//输入长字符串 { string b = str, c = b;//将字符串保存至b,c for (int i = 0; i < b.size(); i++)b[i] = tolower(b[i]);//将b中的字符全部改成小写,以便匹配 int t = b.find(a, 0);//在b中查找a的位置 while (t != string::npos)//若查找成功,则重复循环 { c.erase(t, a.size());//删除c中相应位置字符,c为原串 b.erase(t, a.size());//删除b中相应位置字符,b是改为小写字符的串 t = b.find(a, t);//继续查找b中下一个出现字符串a的位置 } t = c.find(" ", 0);//查找c中的空格 while (t != string::npos) { c.erase(t, 1); t = c.find(" ", 0); }//删除c中所有空格 cout << c << endl; } return 0; }
上面我们主要讨论了string在机试中的用途,接下去我们还要介绍标准模板库中另一个十分实用的标准对象——map。 其功能为将一个类型的变量映射至另一类型。我们用一个例题,介绍和展示其用处和用法。
例 8.2 产生冠军
时间限制:1 秒 内存限制:32 兆
题目描述
有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
球赛的规则如下:如果 A 打败了 B,B 又打败了 C,而 A 与 C 之间没有进行过比赛,那么就认定,A一定能打败 C。
如果 A 打败了 B,B 又打败了 C,而且,C 又打败了 A,那么 A、B、C 三 者都不可能成为冠军。
根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。
输入
输入含有一些选手群,每群选手都以一个整数 n(n<1000)开头,后跟 n 对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。 如果 n 为 0,则表示输入结束。
输出
对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。
样例输入
3 Alice Bob Smith John Alice Smith 5 a c c d d e b e a d 0
样例输出
Yes
No
解题代码
学完图之后再来写。