STL第三讲

news2024/11/23 15:04:14

第三讲

stl六大部件:算法是函数模板,其他的是类模板

算法形式:传入两个迭代器(第三个参数可能有:一个比较的准则

算法需要的所有信息从迭代器获取

迭代器分类

基于红黑树的结构是双向迭代器;

基于hash的取决于:每个bucket是单向还是双向;

关于istream_iterator的迭代器分类:都将自己的迭代器类型定义为input_iterator_tag(ostream_iterator相同)

迭代器分类对算法的影响:distance、advance;

关于copy

右侧的type traits:第四章

相同的例子,视频中还有destroy

unique_copy:

重点区分左右两个版本的区别及其原因:右侧的*result != *first是read-op,如果传入的输出迭代器,引发错误!因此需要重载出左边的版本:找一个中间变量value来读。

调用算法时,注意迭代器类别的“暗示”的重要性:以sort为例,模板参数名称是RandomAccessIterator,因此一定要传入该类型迭代器。尽管其他类型迭代器也不会引发错误,但是不能使算法发挥作用。其他的:

算法源代码剖析

涉及算法:

  • accumulate
  • for_each
  • replace(xxx_if/xxx_copy)
  • count/count_if
  • find/find_if
  • sort
  • binary_search

使用count类、find类、sort类要注意:尽量使用容器自身的实现版本

关联容器有自己的count、find类;没有sort类(因为自身能够保持有序)

list和forward_list有自己的sort(stl的sort要求随机访问迭代器

提到反向迭代器:reverse_iterator()是迭代器适配器

二分查找需要先保证有序

仿函数functors

根据前面的六大部件的关系图,可以看出,仿函数只服务于算法

stl中三种functors的形式:

一个class模板参数;
重载()运算符

GNU C++独有:identity、select1st、select2nd

黄色阴影:stl的functor有继承关系


functor给算法提供服务的示例:

“没有融入stl”:自己写的functor没有继承关系,会有一些使影响(不能被改造)

functors的可支配条件:需要继承适当的东西,如unary_function/binary_function

Adapter

特点:

binder2nd

  1. 一个主体class + 一个小的辅助函数(以binder2为例,主体class是binder2nd,可供调用的小的函数是bind2nd

  2. 传入的数据类型,会先被记下来,以备后续使用

    调用count_if时,传入的第三个参数predbind2nd(less<int>(), 40))后,先把less<int>()40记下(分别对应binder2nd中的opvalue),在count_if使用过程中真正用到pred时,调用到binder2nd中的()才会真正使用这两种先前被记住的类型

  3. 仿函数适配器:修饰functor,生成的结果也应该是functor,因此第1点中提到主体class也要重载()

  4. 一些细节:见上图

  5. 提前记住类型名,有typename的原因:一些类型在编译还未使用,所以要让编译器先同意这种类型合法

视频中提到,GNU自带的非c++标准的适配器有:compose1、compose2

bind

c++11取代binder2nd的:bind
具体用法:《C++ Prime 5th》P354/cplusplus

bind可以指定一个返回值类型的模板参数

迭代器适配器

逆向迭代器

实现的部分:reverse_iterator

插入迭代器:inserter

重点理解:

视频中讲述的,如何在不改变copy算法的源码,通过操作符重载(()),结合inserter实现任意位置的插入

其实是,对于copy,传入的迭代器适配器不同,进行的操作就不同,进一步说明迭代器适配器服务于算法的深刻含义

ostream_iterator/istream_iterator

看视频的思考:

  • 可以理解ostream迭代器为什么设置:=*++
  • 关于istream迭代器:在创建某个带参的istream迭代器时,就已经做了一次读入

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

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

相关文章

idea——git提交到本地记录如何退回/删除

目录 一、git提交到本地记录如何退回/删除 一、git提交到本地记录如何退回/删除 git提交到本地记录&#xff0c;如下图【更新】记录&#xff0c;表示本次提交到git本地需要退回/删除的操作&#xff1a; 选中项目&#xff0c;右键点击【git】——>【Show History】——>…

苹果笔记本MacBook电脑怎么卸载软件?三种方法快速卸载软件

苹果笔记本MacBook电脑是一款非常流行的电脑&#xff0c;但是有时候我们可能需要卸载一些不需要的软件。下面是一些简单的步骤&#xff0c;可以帮助您在MacBook电脑上卸载软件。 苹果笔记本MacBook电脑怎么卸载软件&#xff1f;三种实用方法快速卸载软件&#xff01; 方法一&a…

【数据分享】2023年全球范围土壤数据集HWSD2.0(7个土壤深度/40多种土壤指标)

土壤数据&#xff0c;包括土壤类型、土壤酸碱度、土壤沙含量等指标&#xff0c;对于农业、林业、园艺、环境保护等领域都非常重要。 本次我们为大家带来的是2023年1月份发布的全球范围的土壤数据库。该数据的核心信息如下&#xff1a; ①该数据是基于联合国粮农组织&#xff0…

云HIS为连锁医院机构提供统一医院管理解决方案

云HIS重建统一的信息架构体系&#xff0c;重构管理服务流程&#xff0c;重造病人服务环境&#xff0c;向不同类型的医疗机构提供SaaS化HIS服务解决方案。 云HIS优势 1、云端数据优势 在传统的HIS模式里&#xff0c;数据存于医院本身的服务器机组&#xff0c;一旦发生故障&…

Python学习04—基本图形绘制

通过一个案例来初步认识Python的图形绘制 案例&#xff1a;绘制Python蟒蛇 #PythonDraw.py import turtle turtle.setup(650,350,200,200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pensize(25) turtle.pencolor("purple") turtle.seth(-40) for i…

使用WAF防御网络上的隐蔽威胁之代码执行攻击

什么是代码执行攻击&#xff1f; 攻击者通过漏洞在目标系统上运行恶意代码。 这通常是由于应用程序或系统的安全漏洞&#xff0c;如输入验证不足、软件缺陷或配置错误。这些漏洞为攻击者提供了注入和执行恶意代码的机会。 攻击的类型 远程代码执行&#xff08;RCE&#xff…

linux中用户及用户组信息

1&#xff0c;linux通过用户名和口令来验证用户的身份。 2&#xff0c;几个用户可以组成一个用户组。 3&#xff0c;useradd工具添加用户&#xff0c;groupadd命令添加用户组。 4&#xff0c;history 命令查看用户在Shell中执行命令的历史记录。 5&#xff0c;userdel命令删…

jsjiami.v7介绍

jsjiami.v7介绍 jsjiami.v7是一款在线的JavaScript加密工具&#xff0c;它可以对JavaScript代码进行混淆、压缩、加密等操作&#xff0c;提高代码的安全性和运行效率。jsjiami.v7是jsjiami.v6的升级版&#xff0c;它在2023年1月17日发布&#xff0c;支持新版ES语法&#xff0c…

第二百八十四回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了下拉刷新组件相关的内容&#xff0c;本章回中将介绍WillPopScope组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的WillPopScope组件是一种事件拦截类组件&#xff0c;它没有具体…

php:规范小数位数,例:10.00展示为10,10.98展示为10.98

代码 <?php$value 10.98; // 原始的双精度类型值if ($value floor($value)) {$formattedValue number_format($value, 0); // 10.00 转换为 10echo $formattedValue;} else {$formattedValue number_format($value, 2); // 10.98 保持为 10.98echo $formattedValue;} …

某C2鸡肋漏洞分析:你的CS安全吗?

CobaltStrike是一个知名的红队命令与控制框架&#xff0c;采用Beacon <-> TeamServer <-> Client架构。TeamServer存在受限路径穿越写文件与反序列化漏洞&#xff0c;可以被认证后客户端恶意利用。Client存在反序列化漏洞&#xff0c;可以被RogueCS攻击。 山寨威胁…

注册美区(US)IOS AppleId

根据这个操作&#xff1a; 【2024年】五分钟注册美区AppleID&#xff0c;手把手教&#xff0c;稳定且耐用&#xff01; - 知乎 (zhihu.com) 其中需要注意&#xff1a;付款方式&账单地址 的时候需要按照以下操作 总结&#xff1a; 1、通用-语言地区设置为us美国英语 2、…

eNSP学习——配置通过FTP进行文件操作

原理概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是在TCP/IP网络和Internet上最早使用的协议之一&#xff0c;在TCP/IP协议族中属于应用层协议&#xff0c;是文件传输的Internet标准。主要功能是向用户提供本地和远程主机…

[windows]win11任务管理器性能中N卡GPU看不到cuda进程Copy选项找不到cuda选项

正常情况下Copy里面有cuda选项&#xff0c;如图 对于不懂技术的人来说&#xff0c;有个误区&#xff0c;就是上图没有显示cuda选项就一定是cuda不能用吗&#xff1f;显然不是&#xff0c;这个选项只是方便在资源管理器展示cuda使用情况。如果在windows11你设置了一些东西则可能…

【LeetCode每日一题】2765. 最长交替子数组

2024-1-23 文章目录 [2765. 最长交替子数组](https://leetcode.cn/problems/longest-alternating-subarray/)思路&#xff1a; 2765. 最长交替子数组 思路&#xff1a; 计算给定数组中的最大交替子数组的长度。交替子数组是指相邻元素差值符号交替的子数组。代码通过两层循环遍…

为什么RISC-V的指令结构如此的奇怪

为什么RISC-V的指令结构如此的奇怪 RISC-V 有六种不同的指令集&#xff0c;如下图分别为 R-type / I-type / S-type / B-type / U-type / J-type 但是为什么像B-type的指令不将立即数的顺序排成类似于 imm[12:1] 而是要搞成像上图中分开的样子呢&#xff1f; 刚开始学习 RISC-…

Neos的渗透测试靶机练习——DarkHole-2

DarkHole-2 一、实验环境二、开始渗透1. 搜集信息2. git文件泄露3. SQL注入4. 提权 三、总结 一、实验环境 虚拟机软件&#xff1a;VirtualBox 攻击机&#xff1a;kali linux&#xff08;网卡初始为仅主机模式&#xff0c;要有安全意识&#xff09; 靶机&#xff1a;DarkHole-…

【数据结构】 顺序栈的基本操作 (C语言版)

目录 一、顺序栈 1、顺序栈的定义&#xff1a; 2、顺序栈的优缺点 二、顺序栈的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、顺序栈的初始化 4、顺序栈的入栈 5、顺序栈的出栈 6、取栈顶元素 7、栈的遍历输出 8、顺序栈的判空 9、顺…

记一次Flink通过Kafka写入MySQL的过程

一、前言 总体思路&#xff1a;source -->transform -->sink ,即从source获取相应的数据来源&#xff0c;然后进行数据转换&#xff0c;将数据从比较乱的格式&#xff0c;转换成我们需要的格式&#xff0c;转换处理后&#xff0c;然后进行sink功能&#xff0c;也就是将数…

Linux:vim的相关知识

目录 vim 是一个较为常见的编译文件的命令操作。 三种模式的区分的作用如下&#xff1a; 命令模式&#xff1a; 插入模式&#xff1a; 进入插入模式的标志&#xff1a;左下角有INSERT 底行模式&#xff1a; 命令模式的常见命令&#xff1a; 底行模式常见命令&#xff1…