Andy's First Dictionary

题目链接: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值