杭电ACM-2072 单词数(set容器)

                                                   单词数

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 68521    Accepted Submission(s): 17259


 

Problem Description

lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。

Input

有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。

Output

每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。

Sample Input

you are my friend

#

Sample Output

4

 

字符串处理,就是统计单词,遇到空格就切下一个。不过不同单词有点麻烦,平常没用过getline,这个还真不会,最后还是学了一下别人用set,大佬的代码很简单,我稍微做了修改,就拿这个来说吧。https://blog.csdn.net/jocelyn_ln/article/details/52116337

//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
/*
为什么用set呢,因为set中重复的元素不会插入,
也就是说相同的单词只插入一次,
这样就能很清楚的算出不同单词的个数了。
*/
using namespace std;
const int maxn = 1e4 + 10;  

int main()
{
 	set<string> st;//set容器
	string s,str;
	int flag = 0;//初始化为零
	while(getline(cin,s))  //输入s
	{
		st.clear();//清楚所有元素;
		if(s=="#")
		{
			exit(0);
		}
		if()
		for(int i = 0;i < s.size();i++)		//当前单词
	    {
			str="";			//初始化
			flag=0;         //初始化
			while(s[i]>='a'&&s[i]<='z')
			{
				str+=s[i];          //循环结束后str就是当前字母
				flag=1;   			//给当前单词标记
				i++;
			}
			if(flag==1)				//将标记过的单词插入
			{
				st.insert(str); 	//insert()在容器中插入元素
				str="";				//清空str
			}
		}
		cout<<st.size()<<endl;
	}
	return 0;
}

先说一下getline吧,它有一个很好的特性,

只有getline函数动作完毕时,while才会执行内部的循环

例如:

 while(getline(cin,str))

        {

                cout<<str<<endl;

        }

  只有当所有输入结束时str才会输出,

set有以下两个特性:

第一,它里面的元素不会重复,输入1 1 2 2 3 3 4 4再输出,结果就是1 2 3 4.

第二,它里面的元素是有序的,自动从小到大排列清楚。

下面是部分用法

begin()         返回set容器的第一个元素

end()       返回set容器的最后一个元素

clear()          删除set容器中的所有的元素

empty()     判断set容器是否为空

max_size()     返回set容器可能包含的元素最大个数

size()      返回当前set容器中的元素个数 (相同的不算在内,因为根本没存进去)

rbegin    返回的值和end()相同

rend()     返回的值和rbegin()相同

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值