Essential C++ 面向对象4.1 ~ 5.4
个人认为,结合网上对《Essential c++》的评论,它不适合初学者:
(1)过于精炼,很多内容不会细讲
(2)中文版翻译较生硬,逻辑不够连贯清晰
(3)课后作业有答案,但是没提供网上可编译的源码(网站开梯无法访问),手敲完可能一堆BUG;或者是片段式的答案,即不是完整代码
看的我一脸懵,第5章的代码就不敲了,后续看情况
目录
🌼4.1
🌼4.2
🌼4.3
🌼4.1
要求
造轮子 -- stack
建立 stack.h 和 stack.cpp
编写 stack.cpp 函数,练习操作 Stack 的所有公开接口,并加以编译执行
在 stack.h 中定义 push(), pop(), peek()等函数
在 stack.cpp 中运用 Stack 类提供的接口,从标准输入设备依次读入一些字符串,并将它们 push 到 stack 中,直到读到文件末尾 (EOF),或是 stack 已满
代码
stack.h
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;class Stack {
public:bool push( const string& ); // 声明 push 函数,将字符串压入栈中bool pop( string &elem ); // 声明 pop 函数,从栈中弹出字符串bool peek( string &elem ); // 声明 peek 函数,获取栈顶元素bool empty() const { return _stack.empty(); } // 判断栈是否为空bool full() const { return _stack.size() == _stack.max_size(); } // 判断栈是否已满int size() const { return _stack.size(); } // 获取栈中元素的数量private:vector<string> _stack; // 栈的存储结构,使用 vector 实现
};bool Stack::push( const string &elem ) {if ( full() ) return false; // 如果栈已满,返回 false_stack.push_back( elem ); // 向栈中添加元素return true;
}bool Stack::peek( string &elem ) {if ( empty() ) return false; // 如果栈为空,返回 falseelem = _stack.back(); // 获取栈顶元素return true;
}bool Stack::pop( string &elem ) {if ( empty() ) return false; // 如果栈为空,返回 falseelem = _stack.back(); // 获取栈顶元素_stack.pop_back(); // 弹出栈顶元素return true;
}#endif // STACK_H_INCLUDED
stack.cpp
// stack.cpp#include<iostream>
#include<string>
#include "stack.h"
using namespace std;int main()
{Stack st; // 创建一个 Stack 对象string str;while ( cin >> str && !st.full() ) // 当用户输入字符串且栈未满时,循环执行st.push( str ); // 将读取的字符串压入栈中if (st.empty()) { // 如果栈为空,则输出提示信息并返回 0cout << '\n' << "no strings were read!\n";return 0;}st.peek (str); // 获取栈顶元素,保存在 str 中if (st.size() == 1 && str.empty()) { // 如果栈中只有一个元素且栈顶元素为空字符串,则输出提示信息并返回 0cout << '\n' << "no strings were read\n";return 0;}cout << '\n' << "Read in "<< st.size() << " strings!\n"<< "The strings, in reverse order: \n"; // 输出读取的字符串总数和反序排列后的提示信息while (st.size()) // 当栈不为空时,循环执行if (st.pop(str)) // 从栈中弹出字符串,并输出cout << str << ' ';cout << '\n' << "There are now "<< st.size()<< " elements in the stack!\n"; // 输出栈中剩余元素的数量return 0;
}
输入输出
输入完后,换行,ctrl + Z,表示 EOF(Linux就ctrl + D)
A way a lone a last a loves a long the
^ZRead in 11 strings!
The strings, in reverse order:
the long a loves a last a lone a way A
There are now 0 elements in the stack!
🌼4.2
坑
count()函数的类内声明和类外实现,注意不要写成 bool,否则只会返回 occurs 1 times
要求
扩展 Stack 功能,以支持 find() 和 count() 两个操作
find() 会查看某值是否存在而返回 true 或 false
count() 返回某字符串出现次数
重新实现 4.1 的 .cpp,让它调用这2个函数
以同名的泛型算法来实现这两个函数
为了调用2个泛型算法,需要 global scope(全局作用域)运算符 ::
解释
::count()表示调用全局命名空间中的count()函数,而不是Stack类中定义的同名函数。在这种情况下,::作为区分局部函数和全局函数的作用域限定符,可以指定使用全局命名空间中的函数。如果没有加上::,则编译器会根据它找到的第一个同名函数进行调用,这可能会导致意料之外的结果
代码
stack.h
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;class Stack {
public:bool push( const string& ); // 声明 push 函数,将字符串压入栈中bool pop( string &elem ); // 声明 pop 函数,从栈中弹出字符串bool peek( string &elem ); // 声明 peek 函数,获取栈顶元素bool empty() const { return _stack.empty(); } // 判断栈是否为空bool full() const { return _stack.size() == _stack.max_size(); } // 判断栈是否已满int size() const { return _stack.size(); } // 获取栈中元素的数量// 4.2 拓展bool find( const string &elem ) const;int count( const string &elem ) const;private:vector<string> _stack; // 栈的存储结构,使用 vector 实现
};bool Stack::push( const string &elem ) {if ( full() ) return false; // 如果栈已满,返回 false_stack.push_back( elem ); // 向栈中添加元素return true;
}bool Stack::peek( string &elem ) {if ( empty() ) return false; // 如果栈为空,返回 falseelem = _stack.back(); // 获取栈顶元素return true;
}bool Stack::pop( string &elem ) {if ( empty() ) return false; // 如果栈为空,返回 falseelem = _stack.back(); // 获取栈顶元素_stack.pop_back(); // 弹出栈顶元素return true;
}// 4.2 拓展
bool Stack::find( const string &elem ) const
{vector<string>::const_iterator end_it = _stack.end();return ::find(_stack.begin(), end_it, elem ) != end_it; // 全局作用域 ::
}int Stack::count( const string &elem ) const
{return ::count(_stack.begin(), _stack.end(), elem );
}#endif // STACK_H_INCLUDED
stack.cpp
// stack.cpp#include<iostream>
#include<string>
#include "stack.h"
using namespace std;int main()
{Stack st; // 创建一个 Stack 对象string str;while ( cin >> str && !st.full() ) // 当用户输入字符串且栈未满时,循环执行st.push( str ); // 将读取的字符串压入栈中if (st.empty()) { // 如果栈为空,则输出提示信息并返回 0cout << '\n' << "no strings were read!\n";return 0;}st.peek (str); // 获取栈顶元素,保存在 str 中if (st.size() == 1 && str.empty()) { // 如果栈中只有一个元素且栈顶元素为空字符串,则输出提示信息并返回 0cout << '\n' << "no strings were read\n";return 0;}cout << '\n' << "Read in "<< st.size() << " strings!\n";cin.clear(); // 清除 end-of-file 设定cout << "what word to search for? ";cin >> str;bool found = st.find(str);int count = found ? st.count(str) : 0;cout << str << ( found ? " is " : " isn\'t " ) << "in the stack. ";if (found)cout << "It occurs "<< count << " times\n";return 0;
}
输入输出
A way a lone a last a loved a long the
^ZRead in 11 strings!
what word to search for? a
a is in the stack. It occurs 4 times
🌼4.3
#include <string>
using namespace std;// 定义一个全局封装类 globalWrapper
class globalWrapper {
public:// (静态成员函数)返回测试通过的数量 static int tests_passed() { return _tests_passed; }// 返回已运行的测试数量 static int tests_run() { return _tests_run; }// 返回版本号 static int version_number() { return _version_number; }// 返回版本时间戳 static string version_stamp() { return _version_stamp; }// 返回程序名称 static string program_name() { return _program_name; }// 设置测试通过的数量 static void tests_passed(int nval) { _tests_passed = nval; }// 设置已运行的测试数量 static void tests_run(int nval) { _tests_run = nval; }// (静态成员函数)设置版本号 static void version_number(int nval) { _version_number = nval; }// 设置版本时间戳 static void version_stamp(const string& nstamp) { _version_stamp = nstamp; }// 设置程序名称 static void program_name(const string& npn) { _program_name = npn; }private:static string _program_name; // (静态成员变量)存储程序名称 static string _version_stamp; // 存储版本时间戳 static int _version_number; // 存储版本号 static int _tests_run; // 存储已运行的测试数量 static int _tests_passed; // 存储测试通过的数量
};string globalWrapper::_program_name; // 初始化静态成员变量 _program_name
string globalWrapper::_version_stamp;
int globalWrapper::_version_number;
int globalWrapper::_tests_run; // 初始化静态成员变量 _tests_run
int globalWrapper::_tests_passed;
相关文章:
Essential C++ 面向对象4.1 ~ 5.4
个人认为,结合网上对《Essential c》的评论,它不适合初学者: (1)过于精炼,很多内容不会细讲 (2)中文版翻译较生硬,逻辑不够连贯清晰 (3)课后作业有…...
数组【数据结构与算法】
什么是线性表?什么是非线性表?什么是数组?数组如何实现根据下标随机访问数组元素?为什么数组从下标0开始,不从下标1开始? 什么是线性表? 数据结构元素只有前后关系。 线性表包括:数…...
Python克隆单个网页
网上所有代码都无法完全克隆单个网页,不是Css,Js下载不下来就是下载下来也不能正常显示,只能自己写了,记得点赞~ 效果如图: 源码与所需的依赖: pip install requests pip install requests beautifulsoup4…...
电脑硬盘数据恢复哪个好?值得考虑的 8 个硬盘恢复软件解决方案
借助硬盘恢复软件,任何人都可以在家中恢复丢失的文件,而无需任何特殊技能。事实上,最困难的一步是选择最佳解决方案,因为可用选项的数量可能有点多。幸运的是,这篇文章可以为您提供帮助。 8 款顶级硬盘数据恢复软件解决…...
第二十三节——路由守卫
一、概念 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。简单理解:导航守卫就是路由跳转过程中的一些钩子函数,再直白点路由跳转是一个大的过程,这…...
在gitlab中的使用kaniko打造流水线
文章目录 kaniko工具介绍环境说明系统版本组件版本组件部署参考链接 部署harbor下载解压、创建相关目录配置部署 gitlab集成harbor集成项目ci配置最终结果 kaniko工具介绍 kaniko 是一种从容器或 Kubernetes 集群内的 Dockerfile 构建容器镜像的工具。 kaniko 解决了使用 Doc…...
【C语言 | 预处理】C语言预处理详解(一) —— #define、#under、#if、#else、#elif、#endif、#include、#error
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
19、Flink 的Table API 和 SQL 中的自定义函数及示例(2)
Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...
(动手学习深度学习)第7章 残差网络---ResNet
目录 ResNet总结 ResNet代码实现ResNet的梯度计算 ResNet 总结 残差块使得很深的网络更加容易训练 甚至可以训练一千层的网络 残差网络对随后的深层神经网络设计产生了深远影响,无论是卷积类网络还是全连接类网络。 ResNet代码实现 导入相关库 import torch fro…...
4.Pod详解
4.Pod详解 文章目录 4.Pod详解4.1 Pod介绍4.1.1 Pod结构4.1.2 Pod定义4.1.3 在kubernetes中基本所有资源的一级属性都是一样的,主要包含5部分:4.1.4 在上面的属性中,spec是接下来研究的重点,继续看下它的常见子属性: 4.2 Pod配置4…...
OCR技术狂潮:揭秘最新发展现状,引爆未来智能时代
OCR(Optical Character Recognition,光学字符识别)技术自20世纪以来经历了长足的发展,随着计算机视觉、人工智能和深度学习等领域的进步,OCR技术在准确性、速度和适用范围上都取得了显著的进展。以下是OCR技术发展的现…...
【hcie-cloud】【3】华为云Stack规划设计之华为云Stack交付综述【上】
文章目录 前言华为云Stack交付综述交付流程华为云Stack交付流程华为云Stack安装部署流程 交付工具链华为云Stack交付工具链eDesigner - 让解决方案销售更智能eDesigner配置页面 - 基本信息eDesigner配置页面 - 服务及组网配置eDesigner配置页面 - 弹性云服务器/ECSeDesigner配置…...
Spring Ioc 容器启动流程
Spring容器的启动流程 本文基于 Spring 5.3.23 基于XML文件 public void test() {ApplicationContext applicationContext new ClassPathXmlApplicationContext("applicationContext.xml");User user applicationContext.getBean("user", User.class)…...
【714. 买卖股票的最佳时机含手续费】
目录 一、题目解析二、算法原理三、代码实现 一、题目解析 二、算法原理 三、代码实现 class Solution { public:int maxProfit(vector<int>& prices, int fee) {int nprices.size();vector<vector<int>> dp(n,vector<int>(2));dp[0][0]-prices[0…...
JS前端实现身份证号码合法性校验(校验码校验)
在做项目过程中针对自然人数据提交到后端前一般是要进行身份证的合法性校验,当身份证号输入错误以便给于用户友好的提示(也可以根据身份证号同时校验表单中性别和出生日期等),验证主要是防止无效数据入库。本文在前端使用JavaScript实现15/18位身份证的合…...
操作系统 day09(线程)
线程 为什么引入线程 在没引入进程之前,系统中的各个程序只能串行的执行,比如:只能先听歌,再聊QQ。引入进程之后,各个程序可以并发执行,比如:一边听歌,一边聊QQ。但是现在QQ可以一…...
单通道低压 H 桥电机驱动芯片AT9110H 兼容L9110 马达驱动芯片
H桥直流电机驱动电路是一种用于控制直流电机运转的电路,其主要特点是可以实现正反转控制,控制电机转速和方向,同时也具有过流保护功能。 H桥电路由四个功率晶体管和一些辅助电路组成,其中两个晶体管用于控制电机正转,…...
18. 深度学习 - 从零理解神经网络
文章目录 本文目标预测趋势与关系波士顿房价预测 Hi, 你好。我是茶桁。 我们终于又开启新的篇章了,从今天这节课开始,我们会花几节课来理解一下深度学习的相关知识,了解神经网络,多层神经网络相关知识。并且,我们会尝…...
Pycharm加载项目时异常,看不到自己的项目文件
最近看到一个朋友问,他把项目导入pycharm为什么项目里的包不在项目里显示,只在projects file里显示?问题截图如下: Project里看不到自己的项目文件 只能在Project Files里看到自己的项目文件 问题解答 我也是偶然发现的这个方案…...
目标检测YOLO实战应用案例100讲-基于无人机的轻量化目标检测系统设计(续)
目录 3.2 深度神经网络处理器设计 3.2.1 卷积神经网络处理器设计思路...
专业相机连接SDK源码,为你的影像应用快速构建可靠传输基础
专业相机连接SDK源码,为你的影像应用快速构建可靠传输基础如果你正在开发图片直播、远程拍摄或自动化影像采集类应用,那么“相机与手机稳定传输”这个基础功能,一定是你无法绕过的技术门槛。今天,我们聊聊为什么选择一套成熟的相机…...
从命令行到结果分析:一份超详细的YOLOv5训练VisDrone数据集避坑指南
从命令行到结果分析:一份超详细的YOLOv5训练VisDrone数据集避坑指南 VisDrone数据集作为无人机视角下的目标检测基准,因其复杂的场景和小目标特性成为算法性能的试金石。而YOLOv5凭借其高效的训练速度和优秀的检测精度,成为许多开发者的首选框…...
SAP ABAP开发实战:手把手教你用ALV报表给SM37作业监控做个“体检报告”
SAP ABAP开发实战:用ALV报表打造智能化的作业监控中心 在SAP系统运维的日常工作中,作业监控往往是最容易被忽视却又至关重要的环节。SM37作为标准的作业管理工具,其功能局限让许多ABAP开发者不得不面对这样的困境:当系统出现性能问…...
PRBS(伪随机码)如何驱动现代通信与测试?
1. 为什么PRBS是现代通信的"黄金测试信号"? 第一次接触PRBS时,我和大多数工程师一样疑惑:为什么不用真正的随机信号做测试?直到在25G光模块测试现场看到PRBS31的测试报告才恍然大悟。想象你正在检查高速公路的承重能力—…...
终极指南:5分钟学会用genshin-fps-unlock突破《原神》60帧限制 [特殊字符]
终极指南:5分钟学会用genshin-fps-unlock突破《原神》60帧限制 🎮 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 还在为《原神》PC版的60帧限制而苦恼吗…...
博弈论与AI决策:动态环境下的优化与应用
1. 博弈论与AI的进化需求博弈论这门研究策略互动的数学工具,在AI领域已经默默耕耘了六十多年。从早期的极小化极大算法到现在的多智能体强化学习,博弈论始终在为AI系统提供决策框架。但最近我在开发一个拍卖系统AI时发现,传统博弈论模型在动态…...
LVDS端口悬空竟会导致误触发?一个PCB设计疏忽引发的故障排查与保护电路设计全记录
LVDS端口悬空故障解析:从噪声误触到防护设计的工程实践 在高速数字系统设计中,LVDS(低压差分信号)因其低功耗、高抗干扰性和优异的EMI特性,已成为板间互连的黄金标准。但正是这种看似完美的接口技术,却隐藏…...
为什么你的C++23元编程还在手写type_list?C++26反射让编译期遍历struct字段变成1行代码!
更多请点击: https://intelliparadigm.com 第一章:C26反射元编程的范式革命 C26 将首次在标准中引入原生反射(std::reflexpr)与编译时内省(compile-time introspection)能力,标志着元编程从模板…...
告别内存焦虑!ESP32+LVGL加载PNG图片的实战优化与内存管理技巧
ESP32LVGL深度优化:PNG图片加载与内存管理的实战艺术 在物联网设备的图形界面开发中,ESP32搭配LVGL已成为许多开发者的首选方案。但当涉及到PNG图片加载时,内存限制往往成为最棘手的瓶颈。我曾在一个智能家居面板项目中被这个问题困扰数周——…...
别光看API了!聊聊SpringBoot集成Activiti后,那二十多张表到底都是干嘛的?
别光看API了!聊聊SpringBoot集成Activiti后,那二十多张表到底都是干嘛的? 当你第一次在SpringBoot项目中集成Activiti工作流引擎,启动应用后看到数据库里突然多出的二十多张表,是否感到一头雾水?这些以act_…...
