C++-Primer-Plus 习题解答(第十六章-string类和标准模板库)

题目:16.1

回文指的是顺读和逆读都一样的字符串。例如,“tot”和“otto”都 是简短的回文。编写一个程序,让用户输入字符串,并将字符串引用传 递给一个bool函数。如果字符串是回文,该函数将返回true,否则返回 false。此时,不要担心诸如大小写、空格和标点符号这些复杂的问题。 即这个简单的版本将拒绝“Otto”和“Madam,I'm Adam”。请查看附录F中 的字符串方法列表,以简化这项任务。

bool Func(string ch)
{
	int size = ch.size();
	string::iterator first = ch.begin();
	string::iterator second = ch.end();//这是在最末尾后面了
	second--;
	for (int i = 0; i < size / 2; i++)
	{
		cout << "first=" << *first << endl;
		cout << "second=" << *second << endl;
		if (*first != *second)
		{
			return false;
		}
		first++;
		second--;
	}
	return true;
}

 问题1:string是类模板吗?

string是C++标准库中的一个类模板。在C++中,string类模板用于表示字符串,提供了一系列操作字符串的方法。通过使用string类模板,可以方便地操作字符串,而不需要手动管理内存或处理字符串的长度等问题。因此,string类模板是C++中非常常用的类之一。

题目:16.2 

题: 与编程练习1中给出的问题相同,但要考虑诸如大小写、空格和 标点符号这样的复杂问题。即“Madam,I'm Adam”将作为回文来测试。 例如,测试函数可能会将字符串缩略为“madamimadam”,然后测试倒过 来是否一样。不要忘了有用的cctype库,您可能从中找到几个有用的 STL函数,尽管不一定非要使用它们。

bool Func1(string ch)
{
    int size = ch.size();
    string::iterator first = ch.begin();
    string::iterator second = ch.end();//这是在最末尾后面了
    second--;
    for (int i = 0; i < size / 2; i++)
    {
        cout << "first=" << *first << endl;
        cout << "second=" << *second << endl;
        if (*first != *second)
        {
            return false;
        }
        first++;
        second--;
    }
    return true;
}
bool Func2(string ch)
{
    //需求:判断有符号的一串数字是否是回文数,且要将其全部转为小写字母
    string::iterator it = ch.begin();
    for (; it != ch.end(); )
    {
        if (!isalpha(*it))
        {
            //如果不是字母则将其擦除
            it=ch.erase(it);//这种擦除,ch中所分配的内存是会减少的
            continue;
        }
        else
        {
            //是字母,则转化为小写字母
            *it = tolower(*it);
            it++;
        }
    }
    //判断是否是回文数
   return Func1(ch);
    
}

问题二:getline()的详细用法

getline(cin, input) 是一个 C++ 的标准库函数,用于从标准输入流 cin 中读取一行输入,并将其存储到字符串变量 input 中。

具体方法如下:

  1. getline() 函数接受两个参数,第一个参数是输入流对象,通常是 cin,第二个参数是一个字符串变量,用于存储读取的输入。

  2. 当程序执行到 getline(cin, input) 时,程序会等待用户输入一行字符并按下回车键。

  3. 一旦用户按下回车键,getline() 函数会将用户输入的整行文本读取并存储到 input 字符串变量中。

  4. 如果用户输入的文本长度超过了 input 字符串变量的最大长度,getline() 函数会截断文本并存储到 input 中。

  5. getline() 函数会自动忽略换行符,并将换行符从输入流中移除,因此 input 中不会包含换行符。

  6. getline() 函数会返回一个 istream 对象,可以用来检查输入流的状态。如果输入流正常操作,返回值为 cin,如果发生错误,返回值为 NULL

总之,getline(cin, input) 方法是一个方便的方式来从标准输入流中读取一行输入,并存储到字符串变量中。

问题三:tolower()用法 

 c++ tolower()函数用于将字符转换为小写字母。它接受一个字符作为参数,并返回相应的小写字母字符。

 示例代码:

#include <iostream>
#include <cctype>

int main() {
    char ch = 'A';
    char lowerCh = tolower(ch);

    std::cout << "原始字符: " << ch << std::endl;
    std::cout << "转换为小写字母: " << lowerCh << std::endl;

    return 0;
}

 题目:16.4

题: 编写一个具有老式风格接口的函数,其原型如下:

int reduce(long arr[], int n);

实参应是数组名和数组中的元素个数。该函数对数组进行排序,删 除重复的值,返回缩减后数组中的元素数目。请使用STL函数编写该函 数(如果决定使用通用的unique( )函数,请注意它将返回结果区间的结 尾)。使用一个小程序测试该函数。
//方法1:
int reduce1(long arr[], int n)
{
	//决定使用使用set容器,原因:它不存放重复的元素
	set<long> ans;
	for (int i = 0; i < n; i++)
	{
		ans.insert(arr[i]);
	}
	cout << "ans.size()=" << ans.size() << endl;
	set<long>::iterator it = ans.begin();
	for (; it!=ans.end(); it++)
	{
		cout << *it;
	}
	return ans.size();
}

//方法2:
int reduce2(long arr[], int n)
{
	//unique():功能是去除相邻的重复元素(注意一定是相邻元素,且只保留一个)
	//所以使用前需要对数组进行排序
	
	//对arr进行排序
	//arr+n 表示最后一个元素后面一个位置
	sort(arr, arr + n);
	vector<long>ans;
	
	for (int i = 0; i < n; i++)
	{
		ans.push_back(arr[i]);
	}
	//auto自动识别数据类型
	auto it=unique(ans.begin(), ans.end());

	//取出末尾重复的数
	ans.erase(it, ans.end());
	vector<long>::iterator ret = ans.begin();
	for (ret; ret != ans.end(); ret++)
	{
		cout << *ret << " ";
	}

	cout << endl;
	return 0;
}

 题目:16.5

题: 问题与编程练习4相同,但要编写一个模板函数:

template <class T>
int reduce(T arr[], int n)
在一个使用long实例和string实例的小程序中测试该函数。

template <class T>
int reduce(T arr[], int n)
{
	//使用unique()方法

	//先排序
	sort(arr, arr + n);
	
	//unique函数返回一个指向数组中去除重复元素后的末尾位置的迭代器
	vector<T>ans;
	for (int i = 0; i < n; i++)
	{
		ans.push_back(arr[i]);
	}
	typename vector<T>::iterator it = unique(ans.begin(), ans.end());

	//去除相同的末尾元素
	typename vector<T>::iterator ret = ans.begin();
	ans.erase(it, ans.end());
	for (ret; ret != ans.end(); ret++)
	{
		cout << *ret << " ";
	}

	
	cout << endl;
	return 0;
}

 问题一:为什么在使用类模板时,无法直接使用vector<T>::iterator it 创建一个迭代器

 在C++中,vector<T>::iteratorstd::vector模板类的一个嵌套类型,表示std::vector中的迭代器类型。当使用类模板时,例如std::vector<int>,迭代器类型std::vector<int>::iterator是由编译器根据std::vector<int>的具体类型推导出来的。

因此,在使用类模板时,无法直接使用vector<T>::iterator来创建迭代器,因为T是一个模板参数,需要具体化为一个实际的类型后才能确定vector<T>::iterator的具体类型。您需要使用typename std::vector<T>::iterator来指定迭代器类型,其中typename表示std::vector<T>::iterator是一个类型,而不是一个静态成员。

题目:16.7  

题: 彩票卡是一个常见的游戏。卡片上是带编号的圆点,其中一些 圆点被随机选中。编写一个lotto( )函数,它接受两个参数。第一个参数 是彩票卡上圆点的个数,第二个参数是随机选择的圆点个数。该函数返 回一个vector对象,其中包含(按排列后的顺序)随机选择的号 码。例如,可以这样使用该函数:

vector<int> winners;
winners = Lotto(51, 6);

这样将把一个矢量赋给winner,该矢量包含1~51中随机选定的6个 数字。注意,仅仅使用rand( )无法完成这项任务,因它会生成重复的 值。提示:让函数创建一个包含所有可能值的矢量,使用 random_shuffle( ),然后通过打乱后的矢量的第一个值来获取值。编写 一个小程序来测试这个函数。

vector<int> lotto(int size,int size_rand)
{
	//设置随机数种子
	//srand(time(0));与rand()搭配使用的
	vector<int>ans;
	for (int i = 1; i < size+1; i++)
	{
		ans.push_back(i);
	}
	vector<int>ret;
	//每次随机打乱,抽取第一个
	for (int i = 0; i < size_rand; i++)
	{
		random_shuffle(ans.begin(), ans.end());
		ret.push_back(ans[0]);
	}
	for (int i = 0; i < size_rand; i++)
	{
		cout << ret[i] << " ";
	}
	cout << endl;
	return ret;
}

问题1:randdom_shuffle()用法

 在C++中,random_shuffle()函数用于随机打乱指定范围内的元素顺序。该函数需要包含<algorithm>头文件,并且其用法如下:

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 随机打乱vector中的元素顺序
    std::random_shuffle(vec.begin(), vec.end());

    // 输出打乱后的元素
    for (int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

题目:16.8 

 

题: Mat和Pat希望邀请他们的朋友来参加派对。他们要编写一个程 序完成下面的任务。

  • 让Mat输入他朋友的姓名列表。姓名存储在一个容器中,然后按排 列后的顺序显示出来。
  • 让Pat输入她朋友的姓名列表。姓名存储在另一个容器中,然后按 排列后的顺序显示出来。
  • 创建第三个容器,将两个列表合并,删除重复的部分,并显示这个 容器的内容。
//输出容器内的数据,使用类模板
template <typename T>
class Container {
private:
	T container;

public:
	Container(T c) : container(c) {}

	void print() {
		for (auto it = container.begin(); it != container.end(); ++it) {
			std::cout << *it << " ";
		}
		std::cout << std::endl;
	}
};

//第三个容器显然使用set,set可以去除重复的数
//前两个使用vector

void Show_Name()
{
	vector<string>Mat;
	int count = 1;
	while (count)
	{
		string name;
		cout << "Mat请输入朋友姓名:";
		
		cin >> name;
		cout << endl;
		Mat.push_back(name);
		cout << "是否继续:1继续,0结束:";
		cin >> count;
	}
	//输出容器内容,用类模板,我另一篇博客有有专门总结过
	Container<vector<string>> con(Mat);
	con.print();

	//
	vector<string>Pat;
	count=1;
	while (count)
	{
		string name;
		cout << "Pat请输入朋友姓名:";

		cin >> name;
		cout << endl;
		Pat.push_back(name);
		cout << "是否继续:1继续,0结束:";
		cin >> count;
	}
	//输出容器内容,用类模板
	Container<vector<string>> con2(Pat);
	con2.print();

	//合并两个人的内容
	set<string>ans;
	
	//传入Mat的数据
	vector<string>::iterator it = Mat.begin();
	for (it; it != Mat.end(); it++)
	{
		ans.insert(*it);
	}

	//传入Pat的数据
	vector<string>::iterator itp = Pat.begin();
	for (itp; itp != Pat.end(); itp++)
	{
		ans.insert(*itp);
	}

	Container<set<string>> con3(ans);
	con3.print();

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/610305.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Boost库的使用

1 下载与安装 1.1 下载 网址&#xff1a;Boost C Libraries 进入后选择自己需要的版本安装即可 1.2 安装 1.2.1 解压 1.2.2 编译安装 双击bootstrap.bat 这一步完成后会生成一个b2.exe文件 双击b2.exe文件运行&#xff08;此步需要花费较长的时间&#xff09; 之后再stag…

新增分类——后端

实现功能&#xff1a; 代码开发逻辑&#xff1a; 页面发送ajax请求&#xff0c;将新增分类窗口输入的数据以json形式提交到服务端服务端Controller接收页面提交的数据并调用Service将数据进行保存Service调用Mapper操作数据库&#xff0c;保存数据 代码实现&#xff1a; Con…

遇到如此反复的外贸客户,你可以这样做~

来源&#xff1a;宜选网&#xff0c;侵删 当你们遇到爽快的买家的时候&#xff0c;你是否有把握一定能把她拿下呢&#xff1f; 还是说即使客户很爽快&#xff0c;你也会耐心认真的沟通呢&#xff1f; 今天要和大家分享的这个买家&#xff0c;我本以为他是一个很爽快的买家&am…

前端使用Compressor.js实现图片压缩上传

前端使用Compressor.js实现图片压缩上传 Compressor.js官方文档 安装 npm install compressorjs使用 在使用ElementUI或者其他UI框架的上传组件时&#xff0c;都会有上传之前的钩子函数&#xff0c;在这个函数中可以拿到原始file&#xff0c;这里我用VantUI的上传做演示 a…

基于TRIZ理论的锂电池生产工艺优化思路

在能源科技迅猛发展的今天&#xff0c;锂电池作为重要的储能元件&#xff0c;其生产工艺的优化与革新显得尤为关键。本文将基于TRIZ理论&#xff0c;探讨锂电池生产工艺的优化路径&#xff0c;以期提升能源产业的效率与环保性。 TRIZ&#xff0c;即发明问题解决理论&#xff0…

三级综合医院微信预约挂号系统源码,PC后台管理端+微信公众号+支付宝小程序全套源码

智慧医院预约挂号系统&#xff0c;微信医疗预约挂号小程序源码&#xff0c;实体医院预约挂号支付系统源码 本系统主要面向中大型的医疗机构&#xff0c;适用于各级公立和民营医院&#xff0c;可对接院内his、lis、pacs系统。 PC后台管理端微信公众号支付宝小程序 系统支持当日…

Apinto下载安装以及集群部署总结

下载 下载官方提供的安装包安装&#xff08;推荐&#xff09; wget https://github.com/eolinker/apinto/releases/download/v0.13.3/apinto_v0.13.3_linux_amd64.tar.gz && tar -zxvf apinto_v0.13.3_linux_amd64.tar.gz && cd apinto 安装 先确保已经入解…

浅谈postman设置token依赖步骤

前言&#xff1a; postman做接口测试时&#xff0c;大多数的接口必须在有token的情况下才能运行&#xff0c;我们可以获取token后设置一个环境变量供所在同一个集合中的所有接口使用。 一般是通过调用登录接口&#xff0c;获取到token的值 实战项目&#xff1a;jeecg boot项…

InfluxDB学习之linux上安装InfluxDB

InfluxDB学习之linux上安装InfluxDB 什么是InfluxDB特点使用场景 如何安装windows如何安装linux安装教程&#xff08;不用登录&#xff0c;&#xff09; 界面展示特别说明 什么是InfluxDB InfluxDB 是一个用于存储和分析时间序列数据的开源数据库。由 Golang 语言编写&#xff…

什么是HTTP/2?

HTTP/2&#xff08;原名HTTP 2.0&#xff09;即超文本传输协议第二版&#xff0c;使用于万维网。HTTP/2主要基于SPDY协议&#xff0c;通过对HTTP头字段进行数据压缩、对数据传输采用多路复用和增加服务端推送等举措&#xff0c;来减少网络延迟&#xff0c;提高客户端的页面加载…

分布式锁讲解

概括 分布式锁是一种用于在分布式系统中实现同步机制的锁。在单机系统中&#xff0c;我们可以使用如Java中的synchronized关键字或者 ReentrantLock来实现线程间的同步&#xff0c;但在分布式系统中&#xff0c;由于多个节点&#xff08;服务器&#xff09;之间的并发操作&am…

【探索Java编程:从入门到入狱】Day5

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

CSS基础(盒子模型、浮动、定位)

盒子模型 所有HTML元素可以看作盒子&#xff0c;这个盒子包含了内容、内边距、边框和外边距。 Margin(外边距) -边框外的区域&#xff0c;也就是盒子与其他元素之间的空间&#xff0c;外边距是透明的。Border(边框) - 围绕在内边距和内容外的边框。就是边框大小Padding(内边距…

好题总结汇总

好题总结汇总 总结一些做完很有收获的题。 一、经典问题 DP的结合 1、题意&#xff1a; 给定 n n n 种颜色的球的数量 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​&#xff0c;选出一些不同种类的球(也就是在n种球中选球的任意情况)&#xff0c;将球…

中国工程院院陈纯一行调研实在智能,助推企业科技创新

2024年5月8日&#xff0c;浙江大学计算机科学与技术学院教授、中国工程院院士陈纯院士一行访问了实在智能公司&#xff0c;针对AI Agent智能体进行了专项调研。实在智能创始人、CEO孙林君&#xff0c;以及公司管理层和研发、市场、产品等部门负责人共同出席了座谈会。 陈纯院士…

DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)

尼恩说在前面&#xff1a; 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如字节、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; DDD 的外部接口调用&#xff0c;应该放在…

【JAVA】JAVA的垃圾回收机制详解

对于Java的垃圾回收机制&#xff0c;它是Java虚拟机&#xff08;JVM&#xff09;提供的一种自动内存管理机制&#xff0c;主要负责回收不再使用的对象以释放内存空间。垃圾回收机制主要包括以下几个方面的内容&#xff1a; 垃圾对象的识别&#xff1a;Java虚拟机通过一些算法&…

element ui的table多选

使用el-table的selection-change事件来获取选中的值&#xff1b; 例&#xff1a; html代码&#xff1a; <el-button type"primary" click"openTableSet">列表设置</el-button><!-- 列表设置弹框 --> <el-dialog :close-on-click-mo…

替代UCC21550隔离式双通道栅极驱动器

描述 PC86320是一个隔离的双通道栅极驱动器具有可编程死区时间和宽温度范围。它设计有5A峰值源和6A峰值吸收电流来驱动电源高达2MHz的MOSFET、SiC、GaN和IGBT晶体管开关频率。PC86320可以配置为两个低端驱动器&#xff0c;两个高边驱动器&#xff0c;或具有可编程功能的半桥驱…

二叉树的广度优先遍历 - 华为OD统一考试(D卷)

OD统一考试(D卷) 分值: 200分 题解: Java / Python / C++ 题目描述 有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。 现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请输出层次遍历的结…
最新文章