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;

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

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

相关文章

05-Spring中Bean的生命周期

Bean的生命周期 生命周期就是对象从创建开始到最终销毁的整个过程 , Spring其实就是一个管理Bean对象的工厂,它负责对象的创建和销毁等 Bean生命周期的管理可以参考Spring的源码&#xff1a;AbstractAutowireCapableBeanFactory类的doCreateBean()方法 研究生命周期的意义&am…

【案例】超声波测距系统设计

1.1 总体设计 1.1.1 概述 学习了明德扬至简设计法和明德扬设计规范&#xff0c;本人用FPGA设计了一个测距系统。该系统采用超声波进行测量距离再在数码管上显示。在本案例的设计过程中包括了超声波的驱动、三线式数码管显示等技术。经过逐步改进、调试等一系列工作后&#xf…

Vue中的常用指令v-html / v-show / v-if / v-else / v-on / v-bind / v-for / v-model

前言 持续学习总结输出中&#xff0c;Vue中的常用指令v-html / v-show / v-if / v-else / v-on / v-bind / v-for / v-model 概念&#xff1a;指令&#xff08;Directives&#xff09;是Vue提供的带有 v- 前缀 的特殊标签属性。可以提高操作 DOM 的效率。 vue 中的指令按照不…

【洛谷 P5019】[NOIP2018 提高组] 铺设道路 题解(分治算法+双指针)

[NOIP2018 提高组] 铺设道路 题目背景 NOIP2018 提高组 D1T1 题目描述 春春是一名道路工程师&#xff0c;负责铺设一条长度为 n n n 的道路。 铺设道路的主要工作是填平下陷的地表。整段道路可以看作是 n n n 块首尾相连的区域&#xff0c;一开始&#xff0c;第 i i i …

Jenkins简介及Docker Compose部署

Jenkins是一个开源的自动化服务器&#xff0c;用于自动化构建、测试和部署软件项目。它提供了丰富的插件生态系统&#xff0c;支持各种编程语言和工具&#xff0c;使得软件开发流程更加高效和可靠。在本文中&#xff0c;我们将介绍Jenkins的基本概念&#xff0c;并展示如何使用…

openssl+sha256开发实例(C++)

文章目录 一、 sha256介绍二、sha256原理三、openssl sha256实现 一、 sha256介绍 SHA-256&#xff08;Secure Hash Algorithm 256-bit&#xff09;是一种哈希算法&#xff0c;属于 SHA-2&#xff08;Secure Hash Algorithm 2&#xff09;家族的一员。SHA-256 产生的哈希值是一…

Redis使用Pipeline(管道)批量处理

Redis 批量处理 在开发中&#xff0c;有时需要对Redis 进行大批量的处理。 比如Redis批量查询多个Hash。如果是在for循环中逐个查询&#xff0c;那性能会很差。 这时&#xff0c;可以使用 Pipeline (管道)。 Pipeline (管道) Pipeline (管道) 可以一次性发送多条命令并在执…

【操作系统】考研真题攻克与重点知识点剖析 - 第 3 篇:内存管理

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

Git 服务器上的 LFS 下载

以llama为例&#xff1a; https://huggingface.co/meta-llama/Llama-2-7b-hf Github # 1. 安装完成后&#xff0c;首先先初始化&#xff1b;如果有反馈&#xff0c;一般表示初始化成功 git lfs install ​ # 2. 如果刚刚下载的那个项目没啥更改&#xff0c;重新下一遍&#x…

TP触摸屏调试

此处以MT6739 1g版本敦泰TP为例(kernel 4.19),主要修改点如下: 1. 两个配置文件defconfig: kernel-4.19\arch\arm\configs\k39tv1_bsp_1g_k419_debug_defconfig: kernel-4.19\arch\arm\configs\k39tv1_bsp_1g_k419_defconfig: CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCRE…

一文了解游戏行业(数据分析)

一.概况 1.基本术语 游戏行业基础术语——持续更新ing... 2.产业链 包括游戏开发&#xff0c;发行和销售等环节 ①游戏开发 上游环节是游戏产业链的核心环节&#xff0c;包括游戏策划&#xff0c;美术设计&#xff0c;程序开发等&#xff0c;是决定游戏质量与内容的关键因…

Leetcode刷题详解—— 有效的数独

1. 题目链接&#xff1a;36. 有效的数独 2. 题目描述&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的…

sass 封装媒体查询工具

背景 以往写媒体查询可能是这样的&#xff1a; .header {display: flex;width: 100%; }media (width > 320px) and (width < 480px) {.header {height: 50px;} }media (width > 480px) and (width < 768px) {.header {height: 60px;} }media (width > 768px) …

解决ios向mac复制文字不成功的一种方法

### 环境&#xff1a; ios: 16.7.2 macos: 13.6.1 ### 问题现象&#xff1a; 从ios复制了文字&#xff0c;在mac上粘贴总是不成功&#xff0c;总是粘贴出mac上复制的内容。 ### 问题分析&#xff1a; 可能是mac复制的内容优先级比ios复制的内容优先级高&#xff0c;所以不清…

Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络(CNN)进行人脸识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

链表的逆置

方法1&#xff1a; 依次将指针反向&#xff0c;最后令头指针指向尾元素。 逆置过程如下&#xff1a; 当q指针为空时&#xff0c;循环结束。 //试写一算法&#xff0c;对单链表实现就地逆置&#xff0c; void Reverse1(List plist)//太复杂,不用掌握 {assert(plist ! NULL);i…

Spark Job优化

1 Map端优化 1.1 Map端聚合 map-side预聚合&#xff0c;就是在每个节点本地对相同的key进行一次聚合操作&#xff0c;类似于MapReduce中的本地combiner。map-side预聚合之后&#xff0c;每个节点本地就只会有一条相同的key&#xff0c;因为多条相同的key都被聚合起来了。其他节…

基于轻量级卷积神经网络CNN开发构建打架斗殴识别分析系统

在很多公共场合中&#xff0c;因为一些不可控因素导致最终爆发打架斗殴或者大规则冲突事件的案例层出不穷&#xff0c;基于视频监控等技术手段智能自动化地识别出已有或者潜在的危险行为对于维护公共场合的安全稳定有着重要的意义。本文的核心目的就是想要基于CNN模型来尝试开发…

Mathtype公式自动转Word自带公式

Mathtype公式自动转Word自带公式 前言/word技巧探索过程参考资料&#xff08;有效与无效&#xff09;全自动方案/代码/教程 前言/word技巧 word公式 用ALT号可以输入简单latex显示公式&#xff1b;复杂度&#xff0c;需要引入latex包的不行&#xff1b;显示不出来的话按一下en…

CentOS指令学习

目录 一、常用命令 1、ls 2、cd_pwd 3、touch_mkdir_rmdir_rm 4、cp_mv 5、whereis_which_PATH 6、find 7、grep 8、man_help 9、关机与重启 二、压缩解压 1、zip_unzip 2、gzip_gunzip 3、tar 三、其他指令 1、查看用户登录信息 2、磁盘使用情况 3、查看文件…