先上题(摘录)
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
题意很简单,即统计一句话中不同单词的个数(以空格隔开)
上AC代码
#include<iostream>
#include<cstdio>
#include<sstream>
#include<set>
using namespace std;
int main()
{
string s;
while(getline(cin,s)&&s!="#")
{
istringstream sin(s);//改变输出流
set<string>ss;
string w;//新设立一个string类w来放s
while(sin>>w)
ss.insert(w);//将w中不同的元素插入到集合ss中
cout<<ss.size()<<endl;
}
}
确实 ,看了博客上其它大佬们的题解,这是到水题。
但对俺这种啥都不懂的菜鸟来说不是啊~(不是说看不懂,而是那些语句从没接触过不知道用途)
①istringstream sin(s); 对于一个没接触过多少字符串流的人来说懵了
网上的解释是:
定义一专个字符串输入流的对象属sin,并调用sin的复制构造函数,将s中所包含的字符串放入sin 对象中
说实话没明白在讲啥,不就是复制粘贴吗?
后来的一个解释才懂了
istringstream sin(s) 这句将s数据转换成为输入流,这样,sin就象cin一样的使用了,只是输入数据来源于s中的数据。
为啥所有的教程解释就不能像这句一样通俗易懂一点(哭
也就是说这样定义了以后,你就获得了一个自动输入的“cin”,而且输入的内容已经被你给规定好了(应该是这个意思吧)
②set< string >ss
我做本题前只知道有stl库这个说法,但其实根本没用过里面的东西。这里是定义了一个string类型的“集合”(上过高中的应该都学过),为什么不定义一个数组,就是看重了本题要统计没有重复出现过的单词的个数,正好与集合的概念相吻合。
③string w;//新设立一个string类w来放s
说实话俺还是没太懂为什么一定要再定义一个新的string类w先把原s的内容输进去之后,再把w的元素不重复地插入到集合之中(不能只设一个string一步到头吗?)其实看代码是有一点懂得但是说不太出来为什么(不这样做是错的,每次输出都是1),不知道有没有人能解答一下。
更新:
④getline(cin,s)&&s!="#"
注意getline()接受的是参数是一个输入流和一个string类型的字符串,而cin.getline()接受的则是一个字符数组,在这里只能用getline()
以及停止标记符上要用双引号,不能用单引号