/*
收获:
1. set是数学上的集合,每个元素最多出现一次,和sort函数一样,自定义类型也可定义set,但必须定义小于运算符
关于STL中的set,可见改blog:
http://blog.csdn.net/sunshinewave/article/details/8068326
2. string类中除了size()以外,也有和它意义用法基本一样的length():
http://blog.csdn.net/caomiao2006/article/details/4814927
3. 有用的函数:
isalpha, tolower, 还有以前用过的, isdigit, 在很多时候,可以极大简化代码
另,上面几个函数都是在 <cctype> 头文件中
4. set<string>::iterator 表示的时迭代器,是STL的一个概念,类似于指针(类似是指用法类似)
注意:string中也有迭代器,且之前做题时也遇到过
题号:UVA - 11809 Floating-Point Numbers
链接: http://blog.csdn.net/mofushaohua_ln/article/details/77415016
当时这题里面有这样一句代码
for (string::iterator i = in.begin(); i != in.end(); i++)
if (*i == 'e') *i = ' ';
就是用到了string的迭代器
此外,之前做题时,有了解到反迭代器,有关blog一并放上
http://blog.csdn.net/kjing/article/details/6936325
评价:
本题技巧不多,主要思路就是,用set保存单词集合,同时,输入时把所有非字母的字符变成空格,然后用 stringstream 得到各个单词
*/
#include <iostream>
#include <string>
#include <set>
#include <sstream>
#include <cctype>
using namespace std;
set<string> dict; //string集合
typedef set<string>::iterator p;
//#define debug
int main()
{
#ifdef debug
freopen("E:\\in.txt", "r", stdin);
freopen("E:\\out.txt", "w", stdout);
#endif
string s, buf;
while (cin >> s)
{
for (int i = 0; i < s.length(); i++)
if (isalpha(s[i])) s[i] = tolower(s[i]);
else s[i] = ' ';
stringstream ss(s);
while (ss >> buf)
dict.insert(buf);
}
for (p it = dict.begin(); it != dict.end(); it++)
cout << *it << endl;
#ifdef debug
fclose(stdin);
fclose(stdout);
#endif
return 0;
}