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++知识库 -> 《Essential C++》 第三章 泛型编程风格-课后习题收获 -> 正文阅读

[C++知识库]《Essential C++》 第三章 泛型编程风格-课后习题收获

习题3–1:

1.关于map的查询操作

实现的功能:确保从file中读出来的map没有set里有的值,比如set={a,the},文件中"the boy is a student"。去掉后变成map={{boy,1},{is,1},{student,1}}。
我的方法:

if (find(exclude_set.begin(), exclude_set.end(),
			content) != exclude_set.end())
			//!=即找不到
			word_count[content]++;

content是从file读出的单词,每读出一个content就和set中元素一一比对,如果不是set里的单词,就放进map。

参考答案:

if (exclude_set.count(content))
			continue;//如果返回不是0,说明已经存在,则跳过
		word_count[content]++;
		//创建一个key,并且+1,防止默认值为0,误以为不存在

收获:如果知道是一个容器,用容器共通操作可以降低代码量。

习题3–2、写一个Function Object:

实现:根据字符串长度来进行排序。
首先,sort(首地址,尾地址,比对方法),比对方法是sort在处理时采用的方法,该Function Object必须返回bool值

class size_LessThan
{public:
	bool operator()(const string& s1, const string& s2)
	{return s1.size() < s2.size();}
};

class greater_LessThan
{public:
	bool operator()(const string& s1, const string& s2)
	{return s1.size() > s2.size();}
};

调用方法sort(m_words.begin(), m_words.end(), size_LessThan());
如果把第三个参数换成函数会出现这样的提示:

//class greater_LessThan
//{
//public:
	bool greater_LessThan(const string& s1, const string& s2)
	{
		return s1.size() > s2.size();
	}
//};

在这里插入图片描述
但写成函数显然不实际,但是排序是针对所有元素的,指定某两个string就显得不实际了。
所以对于Function Object,我的理解是:给函数实现特定功能的工具,函数会调用这个Function Object,至于sort如何使用,对我们来说是不知道的,但知道他是为了实现排序功能。

习题3.3:

对于具有如下格式的txt.文件

Zhang San Liang Sanfeng Xueliang
Liu Xiang Yifei
Liang Jiahui Jingru

每一行的第一个单词为"姓",后面的单词都是“名”。读出全部内容,用map进行记录。

1、定义方法

map<string,vector<string>> name;

2、读文件的方法

2.1、按行读取

while (getline(namefile, textline))
{}

按一定条件读取文件,第三参数默认为换行。
这样第一次循环为:Zhang San Liang Sanfeng Xueliang
第一次循环为:Liu Xiang Yifei

2.2、读取单词的方法

?? 用两个指针,一个在右pos,一个在左pre_pos。pos找到这一行下一个空格的位置,比如“Zhang San Liang Sanfeng Xueliang”

第一次循环pre_pos=0,pos=5。则可以知道第一个单词长度为5,读出这五个字符。读出来后pos=5+1,pre_pos=pos。下一个循环。
第二次循环pre_pos=6,pos=9。则可以知道第二个单词长度为9-6=3,读出这3个字符。。。

必要的函数:1.textline.find_first_of(' ', possition),找到从possition为起点的第一个空格的地址,由于起点可能是空格,所以上面的循环中,读出字符后,要pos++,不然一直停在原地。
2.textline.substr(prev_possition, len_ofstr)把textline中从prev_pos开始,长度为 len_ofstr的string提出来

2.3、含有vector的map的数据查询

需要至少两个指针才能更加清晰:

第一个指针:map<string, vector>::const_iterator it = families.begin();
即指向这个map首地址的指针。
第二个指针:vector ::const_iterator vit = it->second.begin();
即指向map首地址的value的指针。

这样遍历"姓"可以通过以下代码

while(it!=families.end())
{
	cout<<*(it->first);
	it++;
}

遍历某一个"姓"下的名

while(vit!= (it->second.end())
{
	cout<<*vit;
	vit++;
}

贴个图吧
在这里插入图片描述

1.vit是不知道总共有多少个名字的,因此需要vit!= (it->second.end()确保其在有效范围内。
2.不管是姓还是名的尾地址都可以通过it知道。it->first即当前it位置的姓,it->second.begin()即当前it位置的名首地址。为了避免过长的指向关系,因此用vit=it->second.begin()

4.4 太简单了,直接看笔记(2)最后一节

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 13:57:27  更:2021-07-22 13:58:42 
 
开发: 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年5日历 -2024/5/2 3:32:19-

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