侯捷C++ (二--STL标准库)2

news2024/11/25 4:53:21

适配器 adapter

也可以叫做改造器,改造已经存在的东西

有:仿函数适配器、迭代器适配器、容器适配器
实现适配,可以使用继承、复合的两种方式实现。
共性:STL使用复合来实现适配

容器适配器

包括stack、queue,内含一个容器,这样也算一种改造

仿函数适配器


bind2nd
可以看到下面的这个例子,使用算法count_if,其中第三个参数是一个predicate,也就是判断雕件,有一个仿函数对象less<int>(),但是他被仿函数适配器bind2nd(将less的第二个参数帮定位40)和not1(取反)修饰,从而实现判断条件为是否小于40。
 

bind2nd调用binder2nd。
图上灰色的东西就是仿函数适配器和仿函数之间的问答!这里就体现了仿函数为什么要继承适合的unary_function或者binary_function等类的原因!
还有一个细节:适配器适配之后的仿函数也能够继续被适配,所以适配器要继承unary_function或者binary_function等类,这样才能回答另外一个适配器的问题。
所以,仿函数必须能够回答适配器的问题,这个仿函数才是可适配的!
 

bind

可以绑定:

functions
function objects
member functions, _1必须是某个object的地址
data members, _1必须是某个object的地址
返回一个function object ret。调用ret相当于调用上述的1,2,3或者相当于取出4.

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

---------------------绑定function,也就是前面的1---------------------
// 占位符的使用方法!!!!!!!!
using namespace std::placeholder;

auto fn_five = bind(my_divide, 10, 2);
cout << fn_five() << endl;// 输出5

auto fn_five = bind(my_divide, _1, 2);
cout << fn_five(10) << endl;// 输出5

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

auto fn_five = bind<int>(my_divide, _2, _1);
cout << fn_five(10, 2) << endl;// 输出0,因为指定了返回类型

---------------------绑定member functions,也就是前面的3---------------------
struct MyPair{
	double a,b;
	double multiply(){ return a * b; }
}
Mypair ten_two { 10, 2 };

//member function其实有一个this指针
auto bound_menfn = bind(&MyPair::multiply, _1);
cout << bound_menfn(ten_two) << endl;// 输出20


---------------------绑定member data,也就是前面的4---------------------
auto bound_mendata = bind(&MyPair::a, ten_two);
cout << bound_mendata() << endl;// 输出10

auto bound_mendata = bind(&MyPair::b, _1);
cout << bound_mendata(ten_two) << endl;// 输出2

迭代器适配器

reverse_iterator
reverse_iterator
rbegin(){
	return reverse_iterator(end());
}
	
reverse_iterator
rend(){
	return reverse_iterator(begin());
}

inserter


可以不用担心copy到的目的容器大小不匹配的问题。
我们调用copy,希望完成在容器指定位置插入一些值,但是需要改变已经写好的copy的功能。

可以通过运算符重载来实现。把相应的容器和迭代器传入 inserter 

因为这个是对迭代器的=运算符行为进行重定义,所以是迭代器的适配器。
 

X适配器: ostream_iterator  istream_iterator

ostream_iterator

适配的是basic_ostream,也是重载=运算符,添加输出操作。

istream_iterator

cin>>x被替换为了x=*iit,适配basic_istream

参考书籍:《STL源码剖析》

参考文章:侯捷C++八部曲笔记(二、STL标准库和泛型编程)_侯捷stl-CSDN博客

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

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

相关文章

MacOS 14.1 配置kerberos认证

MacOS 14.1 配置kerberos认证 MacOS 14.1 配置kerberos认证krb5.conf票据显示程序问题参考地址 MacOS 14.1 配置kerberos认证 原操作系统为 10.14.*&#xff0c;因安装别的软件失败&#xff0c;不想去找旧版本了&#xff0c;所以把OS直接升级到最新版的14.1啦&#xff0c;升级…

[MySQL] SQL优化之性能分析

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、索引优化 1、索引是什么&#xff1a; 2、索引的数据结构&#xff1a; 3、索引种类&#xff1a; 4、sql分析&#xff08;回表查询&#xff09; 二、定位慢查询语句 1、慢查询日志 2、profile详情 3、…

嵌入式开发按怎样的路线学习较好?

嵌入式开发按怎样的路线学习较好&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「嵌入式从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&…

一文读懂:GPU最强“辅助“HBM到底是什么?

各位ICT的小伙伴们大家好呀。 我是老猫。 今天我们聊聊GPU背后的女人&#xff0c;不对&#xff0c;是背后的大赢家-HBM。 那么&#xff0c;HBM究竟是什么呢&#xff1f;为何在AI时代如此火热&#xff1f;下面我们就一一道来。 ▉ HBM到底为何方神圣&#xff1f; HBM全称为H…

C++ Qt开发:如何使用信号与槽

在Qt中&#xff0c;信号与槽&#xff08;Signal and Slot&#xff09;是一种用于对象之间通信的机制。是Qt框架引以为傲的一项机制&#xff0c;它带来了许多优势&#xff0c;使得Qt成为一个强大且灵活的开发框架之一。信号与槽的关联通过QObject::connect函数完成。这样的机制使…

【LeetCode刷题-链表】-- 143.重排链表

143.重排链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ clas…

【JavaWeb笔记】单选框,结合Servlet

各个部分的作用 jsp部分 form action"..."&#xff1a;表单标签&#xff0c;供用户提交数据。内部的submit点击之后相当于是点action的URL input type"radio"&#xff1a;输入类型为单选框。把name设置为一样的&#xff0c;这样效果上就是单选&#xff…

【一周安全资讯1209】《网络安全事件报告管理办法》公开征求意见;IDC发布《大模型在网络安全领域的应用市场洞察报告》

要闻速览 1、国家互联网办公室《网络安全事件报告管理办法》公开征求意见 2、国家标准《信息安全技术 政务计算机终端核心配置规范》公开征求意见 3、IDC发布《大模型在网络安全领域的应用市场洞察报告》 4、赛迪顾问发布《2023中国私有云市场研究报告》 5、美国知名基因测试公…

C#泛型(详解)

前言 介绍C# 入门经典第8版书中的第12章《泛型》 一、泛型的含义 为引出泛型的概念&#xff0c;我们先来看看我们前面提到的 集合类https://blog.csdn.net/qq_71897293/article/details/134684612?spm1001.2014.3001.5501 这些集合是没有具体类型化的&#xff0c;所以…

电脑待机怎么设置?让你的电脑更加节能

在日常使用电脑的过程中&#xff0c;合理设置待机模式是一项省电且环保的好习惯。然而&#xff0c;许多用户对于如何设置电脑待机感到困扰。那么电脑待机怎么设置呢&#xff1f;本文将深入探讨三种常用的电脑待机设置方法&#xff0c;通过详细的步骤&#xff0c;帮助用户更好地…

想进阶JAVA高级程序员吗?多线程必学

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup

文章目录 openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup151.1 背景信息151.2 前提条件151.3 语法151.4 示例151.5 从备份文件恢复数据 openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup 151.1 …

使用xshell连接虚拟机(服务器)

作者&#xff1a;余小小 Xshell Xshell [1] 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以…

【XR806开发板试用】编译FreeRTOS系统

编译FreeRTOS系统&#xff0c;测试串口输出。 一、下载源码 1.1、获取源码 下载源码: rootubuntu:/home# wget https://bbs.aw-ol.com/assets/uploads/files/1693988430633-xr806_sdk.tar.gz 解压文件 rootubuntu:/home# tar xvf 1693988430633-xr806_sdk.tar.gz 1.2、获取…

亚马逊鲲鹏系统自动化操作更节约时间

亚马逊鲲鹏系统的自动化操作为卖家们带来了极大的时间节约和高效运营的利好。这一先进系统在账号注册、养号和下单等方面拥有强大的自动化功能&#xff0c;为卖家提供了简单便捷的操作体验。 首先&#xff0c;亚马逊鲲鹏系统在账号注册方面展现了其强大的自动化能力。用户只需事…

记录一次postgresql临时表丢失问题

项目相关技术栈 springboot hikari连接池pgbouncerpostgresql数据库 背景 为了优化一个任务执行的速度&#xff0c;我将任务的sql中部分语句抽出生成临时表&#xff08;create temp table tempqw as xxxxxxxxx&#xff09;&#xff0c;再和其他表关联&#xff0c;提高查询速…

小红书笔记投流全攻略,打造爆款内容

在小红书平台上&#xff0c;信息流投放和搜索广告是两种主要的广告形式。信息流投放主要通过用户刷作品时展示你的笔记&#xff0c;而搜索广告则是用户搜索相关关键词时展示出的内容。今天就和大家分享下小红书笔记投流全攻略&#xff0c;打造爆款内容&#xff01; 一、什么样你…

Python使用其它文件夹中的.py文件

一、背景 在python构建的工程中&#xff0c;A.py 可能要使用 B.py 文件中的函数、或者类、或者变量&#xff0c;如果这两个文件在同一个目录下&#xff0c;只需要在 A.py 中使用 import B 即可&#xff0c;但如果不在同一目录下&#xff0c;则这种方法不可用&#xff0c;将工程…

租房小程序源码开发中的5大注意事项

在租房小程序源码开发过程中&#xff0c;有许多关键的注意事项需要开发者和团队特别留意。作为该领域的专家&#xff0c;我将分享5大重要事项&#xff0c;以确保你的租房小程序源码开发顺利进行。 1. 确保代码可靠性和安全性 租房小程序源码的可靠性和安全性是开发过程中最重…

【C++】C++异常语法、使用、规范、异常安全及异常的优缺点

1. C异常概念 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的直接或间接的调用者处理这个错误。 throw: 当问题出现时&#xff0c;程序会抛出一个异常。这是通过使用 throw 关键字来完成的。catch: 在您想要处理…