C++候捷stl-视频笔记3

算法的形式

在这里插入图片描述
Cmp通常是个比大小的准则,是Functor。
算法所需的信息通常指迭代器如何移动

迭代器的分类

在这里插入图片描述
array,vector,deque它们是连续的,它们的迭代器是Random Access Iterator/随机访问迭代器
list的迭代器是Bidirectional Iterator/双向迭代器
forward_list的迭代器是Forward Iterator/前向迭代器
基于红黑树的set/multiset, map/multimap它们都是Bidirectional Iterator
基于hashtable的unordered_set, unordered_multiset, unordered_map, unordered_multimap的迭代器是双向的(Bidirectional Iterator)还是单向的(Forward Iterator),要看bucket对应的链表具体是双向链表还是单向链表。具体到STL应该是forward_iterator
在这里插入图片描述
根据分类自己打印各容器的迭代器类型字符串
在这里插入图片描述
利用c++本身typeid打印出迭代器类型
在这里插入图片描述
父类没有数据和函数,只有typedef。目的是为了让子类拥有这些别名,方便写代码
在这里插入图片描述

迭代器分类对算法的影响

在这里插入图片描述
distance:知道两个指针的距离,相当于两个指针相减。如果无法相减,只能循环

typename 的使用是为了指定 iterator_traits<_InputIterator>::difference_type 表示一个类型。iterator_traits<_InputIterator>::difference_type 是迭代器 _InputIterator 的差值类型(表示两个迭代器之间的距离),而 typename 在这里是为了明确告诉编译器这是一个类型而不是其他类型的标 识符
在这里插入图片描述
advance函数会根据iterator_category(__i)的类型选择调用不同的__advance的实现

容器迭代器的分类是基于对象(存在继承关系),而不是基于enum(枚举类型)

迭代器虽然有5种,但根据继承关系(子类is a 父类),只要实现了父类,不需要5种都实现
在这里插入图片描述
copy会不断地做检查,检查是否为某种迭代器,决定copy是否要做某些操作来加速
traits区分赋值拷贝重不重要,如复数类,没有指针不重要
在这里插入图片描述
destroy和前面类似,不断细分类型。traits区分析构函数重不重要
在这里插入图片描述
在这里插入图片描述
unique_copy例子
在这里插入图片描述
算法是模板函数,可以接收任意类型的参数,语法没法指定传入的参数类型
因此在定义模板参数名称的时候,会命名(暗示)它想要接收的类型,比如下图,distance函数想要接收的是input iterator,而sort想要接收的是random access iterator,rotate函数想要接收forward iterator等等

算法源码剖析

在这里插入图片描述
C++标准库提供的algorithm需要符合如下接口

template<typename Iterator>
std::Algorithm(Iterator itr1, Iterator itr2, ...)
{
    ...
}

在这里插入图片描述
一般函数都有两个版本,第二个版本一般是允许增加一种原则或者操作,从而应用的更广泛

myobj是个函数对象,是myclass类,重载了()
在这里插入图片描述
for_each让范围里的所有元素都依次做同一件事情
在这里插入图片描述
replace:范围内的所有等于 old_value 的,都被 new_value 取代
replace_if:范围内所有满足 pred() 为 true 的元素都被 new_value 取代
replace_copy:范围内的元素全部 copy 到新地方,其中所有等于 old_value 的,都被替代为 new_value
在这里插入图片描述
count:在范围中计数值等于 value 的个数
count_if:在范围中计数满足条件 pred() 的个数
所有关联式容器自带成员函数 count()
在这里插入图片描述
find:在范围内找到值等于 value 的元素
find_if:在范围内找到满足 pred() 的元素
所有关联式容器自带成员函数 find()
在这里插入图片描述
所有关联式容器((本身就排好序了)没有成员函数 sort(),array,vector,deque也没有
list、forward_list无法跳跃,因此只能使用自带sort
在这里插入图片描述
逆向迭代器,rbegin()使用end(),然后套用一个reverse_iterator适配器
在这里插入图片描述
二分查找是否存在目标元素(并不给予位置),使用前必须先排序;主要使用 lower_bound() 来找到能放入 val 的最低位置,再判断该元素是否存在

仿函数和函数对象

仿函数只为算法服务,提供一些特殊准则
在这里插入图片描述
在这里插入图片描述
GC++独有的仿函数
在这里插入图片描述
sort仿函数
在这里插入图片描述
STL中的每个仿函数都继承了binary_function<T, T, bool>,表示有两个操作数的操作,共3个模版参数,对应的还有unary_function,表示有1个操作数的操作(如否定)

如果希望自己写的仿函数可以修改,适配,融入stl,就需要继承上述两个结构之一因为adpat可能向functors提问上述三个别名

仿函数就是一个class里头的重载小括号,这样的class创建的对象就是函数对象/仿函数,因为做出来的是一个对象但像一个函数

存在多种Adapter

迭代器适配器(Iterator Adapters):用于在不同迭代器之间进行转换或提供额外功能的适配器。例如,std::back_inserter、std::front_inserter、std::inserter 等。
函数适配器(Function Adapters):用于在函数对象之间进行转换或提供额外功能的适配器。例如,std::bind、std::function 等。
容器适配器(Container Adapters):提供不同接口的容器,例如,std::stack、std::queue、std::priority_queue 等

改造例子:stack 中将 deque 的 push_back 改名为 push

函数适配器

binder2nd

在这里插入图片描述
binder2nd是函数适配器之一,用于将一个二元操作函数(_Operation)和一个固定的值(__y)绑定在一起 —— 绑定第二参数

binder2nd类继承自unary_function,表示其为一元函数对象,其operator()用于执行绑定的操作
在这里插入图片描述

not1

在这里插入图片描述

bind

在这里插入图片描述
占位符 placeholders:
using namespace std::placeholders;
提供了 _1,_2,_3,·······
上面的的 _1 指的是被绑函数中的第一个参数

// functions
double my_divide(double x, double y)
{
	return x/y;
}

// function objects 测试与functions同理
// divides<double> my_divide;

struct MyPair
{
    // data members
	double a, b;
    // member functions
	double multiply()
	{
		return a*b;
	}
};

auto fn_five = bind(my_divide, 10, 2);
cout << fn_five() << endl; // 5.0

auto fn_half = bind(my_divide, _1, 2);
cout << fn_half(10) << endl; // 5.0

auto fn_invert = bind(my_divide, _2, _1);
cout << fn_invert(10, 2) << endl; // 0.2

//将 my_divide 的返回类型变为 int,即 int(x/y)
auto fn_rounding = bind<int>(my_divide, _1, _2); 
cout << fn_rounding(10, 3) << endl; // 3

MyPair ten_two {10, 2};  //定义一个实例ten_two
//绑定 member functions,由于成员函数有 this,所以 _1 就相当于 this,即 x.multiply()
auto bound_memfn = bind(&MyPair::multiply, _1);
cout << bound_memfn(ten_two) << endl; // 20

//把实例 ten_two 绑定到 a,即 ten_two.a
auto bound_memdata = bind(&MyPair::a, ten_two);
cout << bound_memdata() << endl; // 10

auto bound_member_data2 = bind(&MyPair::b, _1);
cout << bound_member_data2(ten_two) << endl;

迭代器适配器

reverse_iterator

在这里插入图片描述
对逆向迭代器取值,就是取其所指正向迭代器的前一个位置

inserter

在这里插入图片描述
对于 copy(InputIterator first, InputIterator last, OutputIterator result),其会不管 OutputIterator 后是否有充裕空间,对 result 开始依次赋值
因此对=操作符重载,将iterator的赋值操作改变为insert操作,如上图下面部分

ostream_iterator

ostream适配器,因为是为了改造basic_ostream
用于将数据输出到输出流(ostream)。它是一个模板类,通常用于将容器中的元素输出到输出流,或者将其他可输出的数据类型输出到流中
在这里插入图片描述
将 copy 变为一个输出工具,分隔符是 ,
其核心依然是操作符重载,这样就相当于 cout<<*first; cout<<“,”;

istream_iterator

用于从输入流(istream)中读取数据。它是一个模板类,通常用于从输入流中读取数据到容器中,或者直接读取输入流中的数据
在这里插入图片描述在创建 iit 的时候就已经把所有的键盘输入读进去了,之后就是一个一个取出来赋值给 value 的操作
++iit; 语句用于使 istream_iterator 前进到输入流的下一个元素。
在这里插入图片描述
copy和istream iterator适配器,对操作符进行重载,实现和cin的同步

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何微调出自己的大模型——LoRA原理解析

1、前言 上一篇文章&#xff0c;我们已经讲了隐扩散模型——Stable Diffusion生成大模型。这种大模型&#xff0c;参数量及其之大。你没有足够的算力资源&#xff0c;就只能够使用人家已经训练好的大模型。既然没有办法训练属于自己的模型&#xff0c;那我们就想&#xff0c;是…

小索引大力量,记一次explain的性能优化经历

在 MySQL 的生产环境中&#xff0c;性能问题是一个常见的挑战。当数据库查询响应时间变慢&#xff0c;或者系统资源消耗异常时&#xff0c;我们需要快速定位问题并进行优化。MySQL 提供了一个强大的工具——EXPLAIN&#xff0c;它可以帮助我们分析查询语句的执行计划&#xff0…

前后端实现文件上传进度条-实时进度

后端接口代码&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 获取文件名String fileName file.getOriginalFilename();// 创建上传目标路径Path targetPa…

读书笔记-Java并发编程的艺术-第2章 Java并发机制的底层实现原理

文章目录 2.1 volatile的应用2.1.1 volatile的定义与实现原理2.1.2 volatile的使用优化 2.2 synchronized的实现原理与应用2.2.1 Java对象头2.2.2 锁的升级与对比2.2.2.1 偏向锁2.2.2.2 轻量级锁2.2.2.3 锁的优缺点对比 2.3 原子操作的实现原理2.3.1 术语定义2.3.2 处理器如何实…

Linux 内存管理 SLUB 分配器

文章目录 前言一、SLUB allocator二、SLUB core参考资料 前言 本文来自&#xff1a;https://lwn.net/Articles/229984/ [Posted April 11, 2007 by corbet]SLAB分配器是用于处理“频繁分配和释放的对象”的对象缓存内核内存分配器。它是内存管理子系统中关键的一部分&#xf…

Opencv 色彩空间

一 核心知识 色彩空间变换&#xff1b; 像素访问&#xff1b; 矩阵的、-、*、、&#xff1b; 基本图形的绘制 二 颜色空间 RGB&#xff1a;人眼的色彩空间&#xff1b; OpenCV默认使用BGR&#xff1b; HSV/HSB/HSL; YUV(视频); 1 RGB 2 BGR 图像的多种属性 1 访问图像(Ma…

MySQL之查询性能优化(三)

查询性能优化 重构查询的方式 在优化有问题的查询时&#xff0c;目标应该是找到一个更优的方法获得实际需要的记过——而不是一定总是需要从MySQL获取一模一样的结果集。有时候&#xff0c;可以将查询转换一种写法让其返回一样的结果&#xff0c;但是性能更好。但也可以通过修…

关于URL获取的参数,无法执行二选一查询

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Arthas调优工具使用

1&#xff0c;服务器端下载 curl -O https://arthas.aliyun.com/arthas-boot.jar 2&#xff0c;服务器端启动 java -jar arthas-boot.jar 选定要绑定的Java进程ID 3&#xff0c;本地idea安装Arthas idea 4&#xff0c;选定方法右键trace,生成命令 trace com.xxx.xxx.xxx.vouche…

C++之noexcept

目录 1.概述 2.noexcept作为说明符 3.noexcept作为运算符 4.传统throw与noexcept比较 5.原理剖析 6.总结 1.概述 在C中&#xff0c;noexcept是一个关键字&#xff0c;用于指定函数不会抛出异常。如果函数保证不会抛出异常&#xff0c;编译器可以进行更多优化&#xff0c;…

Spring Boot既打jar包又打war包如何做

你好&#xff0c;我是柳岸花开。 引言 在软件开发中&#xff0c;根据不同的部署需求&#xff0c;我们可能需要将应用打包成不同的格式。Spring Boot作为目前流行的Java应用开发框架&#xff0c;提供了一种简单的方式来打包应用。本文将介绍如何利用Maven Profiles在Spring Boot…

JDK8安装详细教程教程-windows

&#x1f4d6;JDK8安装详细教程教程-windows ✅1. 下载✅2. 安装 ✅1. 下载 123云盘下载地址&#xff1a; JDK8 | JDK11 | JDK17 官方Oracle地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ ✅2. 安装 运行jdk-8u211-windows-x64.exe安装包文…

Blog项目切换Markdown编辑器———LayUI弹出层弹出写在页面的内容导致的各种bug

【2024.5.24回顾】 1 问题描述(描述完自己解决了…) 正常情况 点击添加文章按钮后&#xff0c;弹出文章编辑界面&#xff0c;如果用富文本功能编辑&#xff0c;则一切正常。可以多次打开、关闭 Markdown 如果在弹出层中点击了切换编辑器按钮&#xff0c;会成功切换为markd…

FreeRTOS的使用与编码器设计

第一步&#xff1a;任务创建&#xff1a;在 FreeRTOS 中&#xff0c;系统功能由任务&#xff08;Task&#xff09;组成。在系统启动时&#xff0c;你需要创建各个任务并指定它们的任务频率、优先级、堆栈大小等参数。 xTaskCreate() 来创建开始任务并定义任务的执行函数、优先级…

Java之instanceof 运算符:掌握它的使用方法

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

人工智能--深度神经网络

目录 &#x1f349;引言 &#x1f349;深度神经网络的基本概念 &#x1f348;神经网络的起源 &#x1f34d; 神经网络的基本结构 &#x1f349;深度神经网络的结构 &#x1f348; 卷积神经网络&#xff08;CNN&#xff09; &#x1f348;循环神经网络&#xff08;RNN&…

期权懂基础知识分享:场外期权怎么做?

今天带你了解期权懂基础知识分享&#xff1a;场外期权怎么做&#xff1f;场外个股期权是一种金融工具&#xff0c;用于在股票市场之外交易。 场外期权怎么做&#xff1f; 签订框架协议&#xff1a;个人需要与机构签订场外期权框架协议&#xff0c;通常无需单独开立账户。 询价…

Web3.0区块链技术开发方案丨中心化与去中心化交易所开发

随着区块链技术的不断发展和普及&#xff0c;加密货币交易所成为数字资产市场中的关键组成部分。其中&#xff0c;中心化交易所&#xff08;CEX&#xff09;和去中心化交易所&#xff08;DEX&#xff09;是两种主要的交易所类型。本文将探讨Web3.0区块链技术开发方案&#xff0…

【Postman接口测试】第四节.Postman接口测试项目实战(中)

文章目录 前言五、Postman断言 5.1 Postman断言介绍 5.2 响应状态码断言 5.3 包含指定字符串断言 5.4 JSON数据断言六、参数化 5.1 Postman参数化介绍 5.2 Postman参数化实现 5.3 针对项目登录接口参数化实现 总结 前言 五、Postman断言 5.1 Postman断言介…

Android 应用权限

文章目录 权限声明uses-permissionpermissionpermission-grouppermission-tree其他uses-feature 权限配置 权限声明 Android权限在AndroidManifest.xml中声明&#xff0c;<permission>、 <permission-group> 、<permission-tree> 和<uses-permission>…