https://vjudge.net/problem/UVA-10815
题目大意:
输入一个文本,找出所有不同的单词,按字典序从大到小输出,单词不区分大小写。
set-集合
1)每个元素最多出现一次,不能有重复;
2)set中元素是从小到大排列的,若自定义set则必要定义小于运算符。
思路:
把每个单词转化为小写,插入set(自动去重&&从小到大的顺序排列),输出set中的元素。
注意点:
1.本题中的set<string>因为string已经定义了小于运算符,所以不必多定义了。
2.tolower是一种函数,功能是把字母字符转换成小写,非字母字符不做出处理。和函数int _tolower( int c )功能一样。
3.stringstream对象的使用
1 #include<bits/stdc++.h> 2 using namespace std; 3 string s,buf; 4 set<string> dict; 5 int main() 6 { 7 string s,res=" "; 8 getline(cin,s);//可带空格 9 stringstream ss(s);//定义一个字符串流ss,并用字符串s去初始化; 10 string tmp; 11 while(ss>>tmp) 12 { 13 //cout<<tmp<<endl; 14 if (res==" ") 15 res=tmp; 16 else 17 res=tmp+" "+res; 18 } 19 cout<<res; 20 return 0; 21 }
本题代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 string s,buf; 4 set<string> dict; 5 int main() 6 { 7 while(cin>>s) 8 { 9 for(int i=0;i<s.length();i++) 10 { 11 if(isalpha(s[i])) 12 s[i]=tolower(s[i]); 13 else 14 s[i]=' '; 15 } 16 stringstream ss(s); 17 while(ss>>buf) 18 dict.insert(buf); 19 } 20 for(set<string>::iterator it=dict.begin();it!=dict.end();it++) 21 cout<<*it<<endl; 22 return 0; 23 }