Essential C++【读书笔记 思考总结】
本篇博客是学习过程中的笔记、思考和总结。原文链接:
- 3 泛型编程风格 Generic Programming
- 3.1 指针的算术运算
- 3.2 了解 Iterator(泛型指针)
- 3.3 所有容器的共通操作
3 泛型编程风格 Generic Programming
STL的主要组件:Container,generic algorithm。
顺序容器:顺序迭代访问。
关联容器:通过key访问。
map:key/value,key用来查找,value用来存储数据。
set:只有key。
通过 function template 实现 generic algorithm。
通过iterator 实现 Container 无关。
通过 template 实现 Container 元素类型无关。
3.1 指针的算术运算
vector 中查找元素:
#include <iostream>
#include <vector>using namespace std;void myFind(const vector<int>& vec, const int & value)
{for (int ix = 0; ix < vec.size(); ++ix){if (value == vec[ix]){cout << "find success:" <<vec[ix] << endl;return;}}cout << "find fail" << endl;
}int main()
{vector<int> vi;vi.push_back(1);vi.push_back(2);vi.push_back(3);myFind(vi, 2);return 0;
}
运行结果:
想办法让这个函数不仅可以处理整数,更可以处理任何类型——前提是该类型定义有equality(相等)运算符。
#include <iostream>
#include <vector>
#include <string>using namespace std;template<typename elemType>
void myFind(const vector<elemType>& vec, const elemType & value)
{for (int ix = 0; ix < vec.size(); ++ix){if (value == vec[ix]){cout << "find success:" <<vec[ix] << endl;return;}}cout << "find fail" << endl;
}int main()
{vector<int> vi;vi.push_back(1);vi.push_back(2);vi.push_back(3);myFind(vi, 2);vector<string> vs;vs.push_back("11");vs.push_back("22");vs.push_back("33");string s1 = "22";myFind(vs, s1);return 0;
}
让一个函数同时可以处理vector与array内的任意类型元素——当然该类型的equality运算符皆已定义。
#include <iostream>
#include <vector>
#include <string>
#include <iterator> using namespace std;template<typename elemType>
void myFind(const elemType* first, const elemType* last, const elemType& value) // 重命名为myFind
{if (!first || !last)return;for (; first != last; ++first){if (*first == value){cout << "find success:" << *first << endl;return;}}cout << "find fail" << endl;
}int main()
{int array[5] = { 1,2,3,4,5 };myFind(array, array + 5, 1);vector<int> vi;vi.push_back(11);vi.push_back(22);vi.push_back(33);myFind(vi.data(), vi.data() + vi.size(), 22);vector<string> vs;vs.push_back("111");vs.push_back("222");vs.push_back("333");string s1 = "333";myFind(vs.data(), vs.data() + vi.size(), s1);return 0;
}
数组的函数传参和函数返回,只有数组的第一个元素地址会被传递。
下标操作:起始地址 +索引 产生新地址,新地址提领获取对象。
指针算术运算中,需要考虑指针类型。
问题:如何扩展 myFind()的功能,令它也能支持标准库所提供的 list 类别?
通过抽象,封装底层指针操作,一个 find实现所有容器的查找功能。
3.2 了解 Iterator(泛型指针)
如何取得iterator呢?
标准容器begin()函数,返回指向第一个元素的iterator。
标准容器end()函数,会返回指向最后一个元素的下一位置的iterator。
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <list>using namespace std;template<typename IteratorType, typename elemType>
IteratorType myFind(IteratorType first, IteratorType last, const elemType& value) // 重命名为myFind
{for (; first != last; ++first){if (*first == value){cout << "find success:" << *first << endl;return first;}}cout << "find fail" << endl;return last;
}int main()
{int array[5] = { 1,2,3,4,5 };myFind(array, array + 5, 1);vector<int> vi;vi.push_back(11);vi.push_back(22);vi.push_back(33);// 使用begin和end函数来调用myFindmyFind(vi.begin(), vi.end(), 22);vector<string> vs;vs.push_back("111");vs.push_back("222");vs.push_back("333");string s1 = "333";// 使用begin和end函数来调用myFindmyFind(vs.begin(), vs.end(), s1);list<string> ls;ls.push_back("1111");ls.push_back("2222");ls.push_back("3333");ls.push_back("4444");string s2 = "4444";myFind(ls.begin(), ls.end(), s2);return 0;
}
现在的 myFind支持一对指针或一对容器的迭代器,同时支持 array,list,vector,有了更大的通用性。
问题:如果容器元素不支持相等运算符,或者用户想用其他条件find,如何增加弹性?
3.3 所有容器的共通操作
- ==
- !=
- =
- empty()
- size()
- clear()
- begin()
- end()
- insert()
- erase()
相关文章:
Essential C++【读书笔记 思考总结】
本篇博客是学习过程中的笔记、思考和总结。原文链接: 3 泛型编程风格 Generic Programming3.1 指针的算术运算3.2 了解 Iterator(泛型指针)3.3 所有容器的共通操作 3 泛型编程风格 Generic Programming STL的主要组件:Container&…...
深度学习实战基础案例——卷积神经网络(CNN)基于Xception的猫狗识别|第2例
文章目录 一、环境准备二、数据预处理三、构建模型四、实例化模型五、训练模型5.1 构建训练函数5.2 构建测试函数5.3 开始正式训练 六、可视化精度和损失七、个体预测总结 今天使用轻量级的一个网络Xception做一个简单的猫狗识别案例,我的环境具体如下: …...
Linux Systemd 配置开机自启
博文目录 文章目录 Systemd操作方式配置方式配置示例参考 Systemd Systemd 是一个用于启动、管理和监控 Linux 系统的初始化系统。它是许多现代 Linux 发行版中默认的初始化系统,取代了传统的 SysVinit 和 Upstart。 Systemd 的引入在 Linux 社区引起了一些争议&…...
华为云云耀云服务器L实例评测|轻量级应用服务器对决:基于 fio 深度测评华为云云耀云服务器L实例的磁盘性能
本文收录在专栏:#云计算入门与实践 - 华为云 专栏中,本系列博文还在更新中 相关华为云云耀云服务器L实例评测文章列表如下: 华为云云耀云服务器L实例评测 | 从零开始:云耀云服务器L实例的全面使用解析指南华为云云耀云服务器L实…...
卸载Visual Studio 2010学习版 —— 卸载VCExpress
目录 最初安装Visual Studio 2010学习版是因为计算机二级 C语言考试而装,现如今考完试后便可卸载掉了,安装简便而卸载却没有uninstall.exe文件。故本文提供卸载方式。 进入到程序目录,找到setup.exe文件,也可以在程序目录搜索set…...
react的状态管理简单钩子方法
1.recoil useProvider文件: import { atom, useRecoilState } from recoil;const initState atom({key: initState,default: {state: [],}, })// 将业务逻辑拆分到一个单独文件中,方便进行状态管理 export interface StateProps {id: number;text: string;isFini…...
【Git】轻松学会 Git:深入理解 Git 的基本操作
文章目录 前言一、创建 Git 本地仓库1.1 什么是仓库1.2 创建本地仓库1.3 .git 目录结构 二、配置 Git三、认识 Git 的工作区、暂存区和版本库3.1 什么是 Git 的工作区、暂存区和版本库3.2 工作区、暂存区和版本库之间的关系 四、添加文件4.1 添加文件到暂存区和版本库中的命令4…...
什么是HTTP头部(HTTP headers)?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 理解 HTTP 头部(HTTP Headers)⭐ HTTP 头部的分类⭐ HTTP 头部的应用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦&#x…...
SpringCloud Alibaba 入门到精通 - Sentinel
SpringCloud Alibaba 入门到精通 - Sentinel 一、基础结构搭建1.父工程创建2.子工程创建 二、Sentinel的整合SpringCloud1.微服务可能存在的问题2.SpringCloud集成Sentinel搭建Dashboard3 SpringCloud 整合Sentinel 三、服务降级1 服务降级-Sentinel2 Sentinel 整合 OpenFeign3…...
【深度学习实验】前馈神经网络(三):自定义多层感知机(激活函数logistic、线性层算Linear)
目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集 2. 激活函数logistic 3. 线性层算子 Linear 4. 两层的前馈神经网络MLP 5. 模型训练 一、实验介绍 本实验实现了一个简单的两层前馈神经网络 激活函数…...
HJ68 成绩排序
描述 给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低…...
FPGA——UART串口通信
文章目录 前言一、UART通信协议1.1 通信格式2.2 MSB或LSB2.3 奇偶校验位2.4 UART传输速率 二、UART通信回环2.1 系统架构设计2.2 fsm_key2.3 baud2.4 sel_seg2.5 fifo2.6 uart_rx2.7 uart_tx2.8 top_uart2.9 发送模块时序分析2.10 接收模块的时序分析2.11 FIFO控制模块时序分析…...
华为云Stack的学习(七)
八、华为云Stack存储服务介绍 1.云硬盘EVS 云硬盘(Elastic Volume Service,EVS),又名磁盘,是一种虚拟块存储服务,主要为ECS(Elastic Cloud Server)和BMS(Bare Metal Se…...
安装k8s集群
一、前置环境配置 安装两台centos 实验环境,一台pc配有docker环境,有两个centsos7容器,其中一个容器作为master,一个作为node。如果master与node都是用默认端口,会存在冲突,所以在此基础上做细微的调整。…...
C++中编写没有参数和返回值的函数
C中编写没有参数和返回值的函数 返回值为 void 函数不需要将值返回给调用者。为了告诉编译器函数不返回值,返回类型为 void。例如: #include <iostream>// void means the function does not return a value to the caller void printHi() {std…...
SWC 流程
一个arxml 存储SWC (可以存多个,也可以一个arxml存一个SWC)一个arxml 存储 composition (只能存一个)一个arxml 存储 system description (通过import dbc自动生成system) 存储SWC和composition的arxml文件分开&#…...
怒刷LeetCode的第10天(Java版)
目录 第一题 题目来源 题目内容 解决方法 方法一:两次拓扑排序 第二题 题目来源 题目内容 解决方法 方法一:分治法 方法二:优先队列(Priority Queue) 方法三:迭代 第三题 题目来源 题目内容…...
java框架-Springboot3-场景整合
文章目录 java框架-Springboot3-场景整合批量安装中间件NoSQL整合步骤RedisTemplate定制化 接口文档远程调用WebClientHttp Interface 消息服务 java框架-Springboot3-场景整合 批量安装中间件 linux安装中间件视频 NoSQL 整合redis视频 整合步骤 RedisTemplate定制化 Re…...
在Bat To Exe Converter,修改为当异常结束或终止时,程序重新启动执行
在Bat To Exe Converter,修改为当异常结束或终止时,程序重新启动执行 .bat中的代码部分: .bat中的代码echo offpython E:\python\yoloProjectTestSmallLarge\detect.pypause,我想你能帮在Bat To Exe Converter,修改成…...
PythonWeb服务器(HTTP协议)
一、HTTP协议与实现原理 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在网络上传输超文本数据的协议。它是Web应用程序通信的基础,通过客户端和服务器之间的请求和响应来传输数据。在HTTP协议中连接客户与服务器的…...
Llama-3.2V-11B-cot 开发环境避坑指南:从 Anaconda 安装到依赖冲突解决
Llama-3.2V-11B-cot 开发环境避坑指南:从 Anaconda 安装到依赖冲突解决 最近在折腾 Llama-3.2V-11B-cot 这个多模态模型,发现不少朋友在第一步——搭建开发环境上就卡住了。要么是 Python 版本不对,要么是 PyTorch 装不上,最头疼…...
重构视频知识提取:Bili2text如何将B站内容转化为结构化文本
重构视频知识提取:Bili2text如何将B站内容转化为结构化文本 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 在信息过载的时代,视频平台…...
PyTorch 2.8镜像快速验证:RTX 4090D执行torch.cuda.is_available()全流程
PyTorch 2.8镜像快速验证:RTX 4090D执行torch.cuda.is_available()全流程 1. 镜像环境概述 PyTorch 2.8深度学习镜像为RTX 4090D显卡深度优化,提供开箱即用的高性能计算环境。这个镜像专为24GB显存显卡设计,预装了完整的CUDA 12.4工具链和必…...
别再死记硬背UART帧格式了!用Arduino UNO和逻辑分析仪,5分钟带你‘看见’数据流
别再死记硬背UART帧格式了!用Arduino UNO和逻辑分析仪,5分钟带你‘看见’数据流 记得第一次接触UART通信时,对着教科书上的帧格式图发呆了半小时——起始位、数据位、校验位、停止位,这些概念就像天书一样。直到有一天,…...
DeOldify在档案修复中的应用:老照片数字化上色企业落地实战案例
DeOldify在档案修复中的应用:老照片数字化上色企业落地实战案例 1. 引言:当黑白记忆遇见彩色未来 想象一下,你手里有一张泛黄的黑白老照片,那是你爷爷年轻时的样子。照片里的他意气风发,但黑白影像总让人觉得少了点什…...
CANopen网络管理NMT避坑指南:从心跳报文0x7F看懂节点状态与PDO失效原因
CANopen网络管理NMT实战诊断:从心跳报文解码到PDO失效精准定位 当你在调试一个由二十多个CANopen节点组成的自动化产线时,突然发现3号工位的传感器数据停止更新——这种场景对工业现场工程师来说再熟悉不过。更棘手的是,CAN分析仪上不断刷新的…...
OpenClaw监控告警方案:千问3.5-27B分析服务器日志
OpenClaw监控告警方案:千问3.5-27B分析服务器日志 1. 为什么需要个人级日志监控方案 去年我的个人博客服务器遭遇了一次持续3天的宕机,直到有读者发邮件反馈才发现问题。传统企业级监控方案如PrometheusGrafana对个人项目而言过于笨重,而简…...
终极跨平台游戏优化工具迁移指南:从Windows到Linux/macOS的完整解决方案
终极跨平台游戏优化工具迁移指南:从Windows到Linux/macOS的完整解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款强大的游戏优化工具,专为管理NVIDIA DLSS、AMD FSR和…...
QW_Sensors嵌入式传感器驱动库详解
1. QW_Sensors 库概述QW_Sensors 是一个面向硬件开发者的轻量级嵌入式传感器驱动库,专为 QW Shield 硬件平台设计。该库并非通用型多平台抽象层,而是深度耦合于 QW Shield 的物理布局、供电逻辑、通信拓扑与固件约束,其核心价值在于将底层硬件…...
HoRain云--OpenCode 配置
🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...
