题目链接:https://vjudge.net/contest/177033#problem/B
题意:给若干行字符串,提取出所有单词并去掉重复的,最后按字典顺序输出单词
题解:可以利用 STL 中的 set,找到单词即插入 set 中,则 set 自动排序这些单词,最后通过迭代器按顺序输出单词即可。
#include<iostream>
#include<sstream>
#include<set>
#include<string>
using namespace std;
//set是一个集合 其名为dict 类型是string 集合中的元素不重复 且集合中的元素是有序的(自动有序化)
set<string> dictionary;
int main(){
string s;
string buf;
while(cin>>s){
for(int i=0;i<s.size();i++)
//isalpha()判断是否是字母 如果是就用头tolower()转换成小写 否则就转为空格 这样是为了字符串流重读入的时候能够把空格去掉
if(isalpha(s[i]))
s[i]=tolower(s[i]);
else
s[i]=' ';
stringstream stream;
//stringstream对象的构造和析构函数通常是非常耗CPU,所以如果重复使用时,每次转换前要使用clear()
stream.clear();
//<< 输入
stream<<s;
//>> 读取
while(stream>>buf)
//将buf插入已经集合中
dictionary.insert(buf);
}
//set不是数组 只能通过迭代器(iterator)把里面的元素倒出来
//迭代器iterator相当于是个类型 it是一个变量
set<string>::iterator it;
// 迭代器相当于是指针 从开始扫到结尾 由于扫描的是地址 因此输出的时候需要用 *it
for(it=dictionary.begin();it!=dictionary.end();++it)
cout<<*it<<endl;
return 0;
}