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 卷积神经网络处理器设计思路...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
