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可以去除重复的数
//前两个使用vectorvoid 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.mzph.cn/bicheng/9726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全视通助力珠海市井岸镇卫生院新院,建设智慧病房

5月6日&#xff0c;位于珠海市斗门区的井岸镇卫生院新院正式启用&#xff0c;面向市民开诊。新院各诊区就医秩序井然&#xff0c;总体情况良好。据统计&#xff0c;截至开诊当天11点30分&#xff0c;新院门诊共接诊347人次&#xff0c;预防接种81人次&#xff0c;儿童体检33人次…

网络相关笔记

IPv4地址 IPv4地址通常以“点分十进制”形式书写&#xff0c;即四个0-255之间的十进制数&#xff0c;各数之间用英文句点&#xff08;.&#xff09;分隔&#xff0c;例如&#xff1a;192.0.2.1。总共32位的地址空间可以表示大约42亿个不同的地址。 IPv4地址结构包括&#xff…

HashSet扩容机制

HashSet底层是HashMap,第一次添加的时候,table数组扩容到16,临界值是16*加载因子(默认是0.75),到达临界值进行扩容。 HashSet<Integer> hashSet = new HashSet<>();hashSet.add(5);hashSet.add(2);hashSet.add(5);hashSet.add(8);hashSet.add(1);当new一个H…

【C++STL详解(十)】--------priority_queue的模拟实现

目录 前言 一、堆的向上调整算法 二、堆的向下调整算法 三、优先队列模拟实现 Ⅰ、接口总览 Ⅱ、各个接口实现 1.构造函数 2.仿函数 3.向上调整 4.向下调整 5.其余接口 Ⅲ、完成代码 前言 上节内容我们简单的介绍了关于priority_queue的使用内容&#xff0c;我们明白…

秒杀系统架构设计-01

前言 在当今互联网技术快速发展的背景下&#xff0c;电商平台的秒杀活动成为了一个热门话题。特别是对于技术人员而言&#xff0c;如何设计一个高效、可靠的秒杀系统架构&#xff0c;已经成为了面试中的常见问题。这篇博文将围绕秒杀系统架构设计的大纲和授课思路&#xff0c;…

【TypeScript高级类型简介以及使用方法】

TypeScript 的高级类型提供了更复杂的类型系统&#xff0c;允许开发者更精确地描述和约束代码中的数据类型。以下是几种常用的 TypeScript 高级类型及其简介和使用方法&#xff1a; 交叉类型&#xff08;Intersection Types&#xff09; 交叉类型是将多个类型合并为一个类型&…

Baidu Comate 编程插件:提升开发效率的利器

文章目录 引言简介目的 Baidu Comate插件概述定义与功能市场现状竞品分析 安装与配置VsCode 安装&#xff1a;注意事项 版本选择 核心特性详解功能介绍代码生成实时续写错误纠正 使用体验体验地址 引言 简介 基于文心大模型&#xff0c;结合百度积累多年的编程现场大数据和外…

三维dp,LeetCode 741. 摘樱桃

一、题目 1、题目描述 给你一个 n x n 的网格 grid &#xff0c;代表一块樱桃地&#xff0c;每个格子由以下三种数字的一种来表示&#xff1a; 0 表示这个格子是空的&#xff0c;所以你可以穿过它。1 表示这个格子里装着一个樱桃&#xff0c;你可以摘到樱桃然后穿过它。-1 表示…

设计一个people类 如何输入用户自定义个数的对象?

题目: 设计一个People 类&#xff0c;该类的数据成员有姓名、年龄、身高、体重和人数&#xff0c;其中人数为静态数据成员&#xff0c;成员函数有构造函数、显示和显示人数。其中构造函数由参数姓名、年龄、身高和体重来构造对象&#xff1b;显示函数用于显示人的姓名、年龄、…

PDF批量编辑:PDF转HTML批量操作技巧,提升文档格式转换效率

在数字化办公日益普及的今天&#xff0c;PDF&#xff08;Portable Document Format&#xff09;作为一种跨平台的文件格式&#xff0c;广泛应用于各种文档的存储和传输。然而&#xff0c;PDF文件的不可编辑性使得在某些情况下&#xff0c;我们需要将其转换为HTML格式以便更好地…

蓝桥杯备赛1.统计单词数

题目链接&#xff1a;P1308 [NOIP2011 普及组] 统计单词数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> #define int long long #define endl \n const int N 1e510; using namespace std; int a[N]; signed main() {std::ios::sync_with_st…

【国产SSL】哪家SSL证书可以保证数据不出境,是在国内验签

随着网络安全的重视&#xff0c;网站安装SSL证书已经是标配了。但是为什么目前常见的SSL证书都是国外的&#xff1f;数据受国外掌控&#xff0c;安全吗&#xff1f;那么哪家国产品牌是可以保证数据不出境的呢&#xff1f; 为什么目前常见的SSL证书都是国外的&#xff1f; 原因…

您的计算机已被360勒索病毒感染?恢复您的数据的方法在这里!

引言 .360勒索病毒&#xff0c;作为BeijingCrypt勒索病毒家族的一员&#xff0c;因其独特的加密技术和狡猾的传播方式&#xff0c;已成为网络安全领域的重大威胁。它不仅能加密用户的重要文件&#xff0c;使文件无法被正常访问和使用&#xff0c;还可能进一步破坏系统&#xf…

ssh连接服务器教程,账号密码登陆和通过密钥直接登陆

ssh如何连接服务器&#xff1f; 两种连接方式 通过账号密码登陆通过密钥直接登陆 通过账号密码登陆 在终端使用命令登陆&#xff1a;ssh [服务器用户名][服务器ip或服务器域名]之后输入服务器用户密码即可登陆 通过密钥直接登陆 首先在本地创建自己的私钥公钥&#xff0c…

Java苍穹外卖05-订单状态定时处理-数据统计-导出excel

一、订单状态定时处理 1.Spring Task ①介绍 应用场景&#xff1a; ②cron表达式 https://cron.qqe2.com/ ③入门案例 2.需求分析 3.代码开发 每一分钟检查是否存在超时15分钟的订单 每天凌晨一点处理上一条处于派送中的订单 mapper&#xff1a; 二、来单提醒、客户催单 1…

WPF (Windows Presentation Foundation) 中 Attribute(属性)和 Property(属性)

在 WPF (Windows Presentation Foundation) 中&#xff0c;Attribute&#xff08;属性&#xff09;和 Property&#xff08;属性&#xff09;是两个相关但不同的概念。 Attribute&#xff08;属性&#xff09;是一种元数据&#xff0c;用于给类型、成员或其他代码元素添加附加…

手撕C语言题典——移除链表元素(单链表)

目录 前言 一.思路 1&#xff09;遍历原链表&#xff0c;找到值为 val 的节点并释放 2&#xff09;创建新链表 二.代码实现 1)大胆去try一下思路 2&#xff09;竟然报错了&#xff1f;&#xff01; 3&#xff09;完善之后的成品代码 搭配食用更佳哦~~ 数据结构之单…

CellChat包文献介绍

Inference and analysis of cell-cell communication using CellChat - PubMed (nih.gov) 目录 在线数据 摘要 基础介绍 分析结果 1&#xff0c;概述 2&#xff0c;识别预测通路 3&#xff0c;连续的信号转导 4&#xff0c;预测空间共定位细胞群之间的关键信号转导事件…

算法随想录第四天打卡|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交 ,142.环形链表II

24. 两两交换链表中的节点 用虚拟头结点&#xff0c;这样会方便很多。 本题链表操作就比较复杂了&#xff0c;建议大家先看视频&#xff0c;视频里我讲解了注意事项&#xff0c;为什么需要temp保存临时节点。 题目链接/文章讲解/视频讲解&#xff1a; 代码随想录 Python # De…

Al Agent:开启智能化未来的关键角色,让机器更智能的为我们服务

文章目录 &#x1f680;Al Agent是什么&#x1f4d5;Al Agent的工作原理与技术&#x1f4aa;Al Agent应用领域&#x1f680;智能家居应用&#x1f308;医疗健康领域⭐金融服务行业&#x1f302;交通运输管理&#x1f3ac;教育培训应用 &#x1f512;Al Agent优势与挑战✊Al Age…