IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 例题5-3安迪的第一个字典 UVa10815--C++STL库映射set的应用 -> 正文阅读

[C++知识库]例题5-3安迪的第一个字典 UVa10815--C++STL库映射set的应用

前言

不定期更新C++的STL库以及算法练习的笔记
分享给大家 也是督促自己不断努力学习算法与程序设计
学习算法之前,要想高效简洁的写好代码,还需要熟练掌握STL库的一些方法和数据结构
参考书籍:
《算法竞赛入门经典》(第2版)刘汝佳 著
《挑战程序设计竞赛》巫泽俊 主译


一、题目描述

输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出。单词不区分大小写。
Sample Input
Adventures in Disneyland
Two blondes were going to Disneyland when they came to a fork in the
road. The sign read: “Disneyland Left.”
So they went home.
Sample Output
a
adventures
blondes
came
disneyland
fork
going
home
in
left
read
road
sign
so
the
they
to
two
went
were
when
注:文末附有原版英文题目

二、思路分析与代码书写

1.集合set

题目中提到“所有不同的单词”,一下子就能想到集合,因为集合具有互异性【任意一个元素不会在集合中出现多次】
此外,STL中的集合还默认将元素从小到大排列,这样还解决了字典序的问题。
综上,基于互异性和字典序,我们选择创建集合来解题。
如果对set的使用不熟练,或者第一次接触,可以看这一篇文章:
C++STL集合set基本使用

2.题目思路分析

①单词不区分大小写,显然我们需要有一个将单词统一成小写(因为小写字母占绝大多数)的过程。
②此外,样例输入的文本中有句点.也需要处理,否则影响我们程序的搭建。这里将句点统一换成空格(因为单词之间本身就是空格隔开)。
③一段文字可以是一个string。但显然我们希望一个单词是一个string。既然输入的是一段文本,也就是单词和空格的组合,那这时我们想到用stringstream流读入读出,也就是说从流里每次读出一个string并加入集合。显然如果这个单词已经出现过了,集合里不会重复添加。
④最后定义一个迭代器iterator,用以遍历集合中所有的单词并输出。

3.完整代码书写

该代码参考刘汝佳老师书上的代码,自己根据思路独立完成,可能细节上与老师略有不同。

首先是头文件,一个都不能少。(实际写代码过程中可能是边写边添加的)

#include<iostream>
#include<set>
#include<string>
#include<sstream>
#include<cctype>

其中cctype提供tolower()函数和isalpha()函数

考虑到文段中有字母空格和句点三种情况,因此分两类处理:
是字母的,变小写
否则,变空格

完整程序:

int main()
{
	string s,buf;
	while(cin>>s){
		if(s[0]=='#')break;//这里为了调试方便,输入#表示数据读取结束,不影响系统评判
		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);//从字符串流中逐一读出每个词并添加到字典里 
	} 
	set<string>::iterator it;
	for(it=dict.begin();it!=dict.end();++it){
		cout<<*it<<endl;
	} 
	return 0;
}

提交结果

最后几句话

集合有着其互异性这一独特的特性,因此在许多竞赛和练习中应用广泛。
使用时务必记得头文件#include<set>
另外string和stringstream虽然好用。但是在算法竞赛中依然要慎重。因为string慢,stringstream更慢。
附:UVa10815原题:
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:26:28  更:2021-07-31 16:26:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/27 18:02:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码