C++之STL的algorithm(8)之适配器(bind等)整理
C++之STL的algorithm(8)之适配器(bind等)整理
注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构
C++ 的适配器整理
- C++之STL的algorithm(8)之适配器(bind等)整理
- 一、 集合相关操作算法
- 1、函数对象适配器
- 1.1 利用bind2nd进行绑定
- 1.2 继承public binary_function<参数1 类型,参数2类型,返回值类型>
- 2. 取反适配器
- 2.1 一元取反
- 2.2 二元取反
- 3. 函数指针适配器
- 3.1 ptr_fun将普通函数指针适配成函数对象
- 4. 成员函数适配器
- 4.1 如果存放的是对象实体 mem_fun_ref
- 4.2 如果存放的是对象指针 mem_fun
- 总结
提示:本文为 C++ 适配器的写法和举例
一、 集合相关操作算法
C++中的适配器是一种设计模式,它允许将某个类的接口转换为客户端所期望的另一种接口,从而使得原本不兼容的接口能够协同工作。在C++标准库中,适配器模式被广泛应用在函数对象和迭代器等组件上。
下面,每一种适配器模式给出简要的描述和代码示例。
1、函数对象适配器
函数对象适配器用于将一个二元函数对象(即带有两个参数的函数对象)适配为只接受一个参数的函数对象。
1.1 利用bind2nd进行绑定
bind2nd用于将一个二元函数对象的第二个参数绑定为某个固定值,生成一个新的一元函数对象。
cpp复制
#include <functional>
#include <iostream>
int main() {
std::plus<int> plusObj; std::binder2nd<std::plus<int>> binder(plusObj, std::placeholders::_2);binder(5); // 这其实是不合法的,因为bind2nd返回的是一个一元函数对象,需要提供一个参数 // 正确的使用方式是与其他函数适配器结合使用,例如与std::bind auto bound_func = std::bind(binder, std::placeholders::_1); std::cout << bound_func(3) << std::endl; // 输出8,因为相当于plusObj(3, 5) return 0;}
1.2 继承public binary_function<参数1 类型,参数2类型,返回值类型>
binary_function是一个模板基类,提供了first_argument_type、second_argument_type和result_type三个嵌套类型,用于描述二元函数对象的参数类型和返回值类型。
#include <functional>
struct MyBinaryFunction : public std::binary_function<int, int, int> { int operator()(int a, int b) const { return a + b; }};
int main() { MyBinaryFunction myFunc;std::cout << myFunc(3, 4) << std::endl; // 输出7 return 0;}
2. 取反适配器
取反适配器用于将一个函数对象的返回值取反。
2.1 一元取反
not1not1用于生成一个返回值为原函数对象返回值逻辑非的一元函数对象。
#include <functional>
#include <iostream>
bool is_positive(int x) { return x > 0;}
int main() { std::function<bool(int)> func = is_positive; std::not1<std::function<bool(int)>> notFunc(func); std::cout << notFunc(-3) << std::endl; // 输出1(true),因为-3不是正数 return 0;}
2.2 二元取反
not2not2用于生成一个返回值为原二元函数对象返回值逻辑非的一元函数对象。
#include <functional>#include <iostream>bool compare(int a, int b) { return a < b;}int main() { std::function<bool(int, int)> func = compare; std::not2<std::function<bool(int, int)>> notFunc(func); std::cout << notFunc(5, 3) << std::endl; // 输出1(true),因为5不小于3 return 0;}
3. 函数指针适配器
函数指针适配器用于将普通函数指针适配为函数对象。
3.1 ptr_fun将普通函数指针适配成函数对象
#include <functional>
#include <iostream>
int add(int a, int b) { return a + b;}
int main() { std::pointer_to_binary_function<int, int, int> funcPtrAdapter(add); std::cout << funcPtrAdapter(3, 4) << std::endl; // 输出7 return 0;}
4. 成员函数适配器
成员函数适配器用于将类的成员函数适配为函数对象。
4.1 如果存放的是对象实体 mem_fun_ref
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
struct MyClass { int value; MyClass(int v) : value(v) {} int get_value() const { return value; }};int main() { std::vector<MyClass> vec{MyClass(3), MyClass(5), MyClass(1)}; std::sort(vec.begin(), vec.end(), std::mem_fun_ref(&MyClass::get_value));for (const auto& obj : vec) { std::cout << obj.value << ' '; } std::cout << std::endl; // 输出 1 3 5 return 0;}
4.2 如果存放的是对象指针 mem_fun
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
struct MyClass { int value; MyClass(int v) : value(v) {} int get_value() const { return value; }};int main() { std::vector<MyClass*> vec{new MyClass(3), new MyClass(5), new MyClass(1)}; std::sort(vec.begin(), vec.end(), std::mem_fun(&MyClass::get_value)); for (MyClass* obj : vec) { std::cout << obj->value << ' '; } std::cout << std::endl; // 输出 1 3 5 // 释放内存 for (MyClass* obj : vec) { delete obj; } return 0;}
请注意,由于std::mem_fun、std::mem_fun_ref、std::ptr_fun、std::bind2nd、std::binder2nd等函数适配器在C++11之后逐渐被认为是不推荐的,并在C++17中被移除,因此在实际编程中,我们更推荐使用std::bind、std::function以及lambda表达式来创建函数对象和适配器。上面的代码示例主要是为了展示这些适配器的使用方式,并不推荐在实际项目中使用。
总结
相关文章:
C++之STL的algorithm(8)之适配器(bind等)整理
C之STL的algorithm(8)之适配器(bind等)整理 注:整理一些突然学到的C知识,随时mark一下 例如:忘记的关键字用法,新关键字,新数据结构 C 的适配器整理 C之STL的algorithm&…...
部分国企笔试总结
2024.3.30相城区某国企笔试 客观题,30分 类似考公行测题(大部分)部分计算机专业基础知识(仅几题) 主观题,70分 网络安全类一道C编程题:用户输入圆半径r,程序计算面积和周长并输出…...
《QT实用小工具·二十二》多种样式导航按钮控件
1、概述 源码放在文章末尾 该项目实现了多种样式的导航按钮控件 可设置文字的左侧、右侧、顶部、底部间隔。 可设置文字对齐方式。 可设置显示倒三角、倒三角边长、倒三角位置、倒三角颜色。 可设置显示图标、图标间隔、图标尺寸、正常状态图标、悬停状态图标、选中状态图标…...
不定长顺序表
一.不定长顺序表的结构: typedef struct DSQList{ int* elem;//动态内存的地址 int length;//有效数据的个数 int listsize;//总容量 }DSQList,*DPSQList; 很明显,为了能实现扩容(否则如何实现再次判满呢?),我们必须要在定长顺序表的基础上增加一个总容量;结构示意图如下: 二…...
5.网络编程-socker(golang版)
目录 一、什么是socket? 二、Golang中使用TCP TCP服务端 TCP客户端 三、TCP黏包,拆包 1.什么是粘包,拆包? 2.为什么UDP没有粘包,拆包? 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …...
网格矢量如何计算莫兰指数
网格矢量如何计算莫兰指数 引言 遇到一个问题,计算矢量网格的莫兰指数。 概念解释 莫兰指数 莫兰指数(Moran’s Index)是一种空间自相关指标,用于衡量空间数据的相似性和聚集程度。它可以用来描述一个区域与其邻近区域之间的属…...
《containerd原理剖析与实战》大模型时代下如何学习云原生
大模型与云原生 近年来,大语言模型的热度可谓是愈发高涨,尤其是今年年初 Sora 的出现,更是让全球再次看到了AIGC 的巨大威力。 Sora 生成实例视频---几头巨大的长毛猛犸踏着积雪的草地而来 在当前大模型流行的时代下,云原生技术…...
【实用工具】使用飞书机器人监控工程日志
1.创建一个飞书群聊,设置-->群机器人-->添加机器人-->自定义机器人-->修改机器人名称-->添加 2.复制webhook地址 3.编写日志请求代码 import logging import requests import json import os from datetime import datetime import time import sub…...
NIKKE胜利女神PC怎么设置中文 手把手教你设置中文教程
这个游戏中的妮姬分四个企业,其中朝圣者这个派别的妮姬很少而且不在愿望单理,朝圣者的所有姐姐都很哇塞,红莲更是其中的大姐大。一般想抽朝圣者只能靠歪或者出限定卡池,举个栗子,我入坑的时候 朝圣者 神罚 是限定卡池&…...
【leetcode面试经典150题】2.移除元素(C++)
【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...
实现几何对象按照一定距离向外缓冲
1、首先,确保你已经引入了Turf.js库。你可以通过在HTML文件中添加以下代码来引入 <script src"https://cdn.jsdelivr.net/npm/turf/turf6.5.0/turf.min.js"></script>2、使用turf.buffer实现几何对象按照设定距离扩充 let originalCoordinat…...
现代深度学习模型和技术
Transformer模型的理解和应用 Transformer模型自2017年由Vaswani等人在论文《Attention is All You Need》中提出以来,已经彻底改变了自然语言处理(NLP)领域的面貌。Transformer的核心是自注意力(Self-Attention)机制…...
go的orm框架-Gorm
官网文档 特点 全功能 ORM 关联 (拥有一个,拥有多个,属于,多对多,多态,单表继承) Create,Save,Update,Delete,Find 中钩子方法 支持 Preload、Joins 的预加载 事务&…...
嵌入式开发学习---(部分)数据结构(无代码)
数据结构 为什么学习数据结构? 1)c语言告诉如何写程序,数据结构是如何简洁高效的写程序 2)遇到一个实际问题,需要写程序去实现相应功能,需要解决那两个方面的问题? 如何表达数据之间的逻辑规律…...
ChatGPT 之联盟营销
原文:ChatGPT for Affiliate Marketing 译者:飞龙 协议:CC BY-NC-SA 4.0 第二章 制定转化对话 制定转化对话是每个营销人员和企业所有者都应该掌握的关键技能。它涉及创建和传递引人入胜的信息,吸引您的受众并激励他们采取行动。…...
1.k8s简介
目录 k8s是什么 k8s不是什么 云原生 微服务 整体式架构与微服务架构 微服务的特性 微服务的优势 k8s是什么 Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快…...
go包下载时报proxyconnect tcp: dial tcp 127.0.0.1:80: connectex错误的解决方案
一大早的GoLand就开始抽风了,好几个文件import都红了,于是我正常操作点击提示的sync,但是却报了一堆错: go: downloading google.golang.org/grpc v1.61.1 go: downloading google.golang.org/genproto v0.0.0-20240228224816-df9…...
Vaadin框架是如何处理前后端交互的?列举几个Vaadin中常用的UI组件,并描述它们的作用。如何使用Vaadin的布局管理器来构建复杂的用户界面?
Vaadin框架是如何处理前后端交互的? Vaadin框架处理前后端交互的方式主要基于服务端渲染和事件驱动的编程模型。以下是具体的处理过程: 服务端渲染:Vaadin应用程序的UI组件是在服务器端创建和渲染的。当用户在浏览器中访问应用程序时&#x…...
动态属性的响应式问题和行内编辑的问题
动态属性的响应式问题 通过点击给目标添加动态数据,该数据不具备响应式特性 如下图: 点击编辑,前面的数据框会变成输入框,点取消会消失 // 获取数据 async getList () {const res await xxxthis.list res.data.rows// 1. 获…...
微信小程序第六次课(模块化和绑定事件)
模块化 1.首先 我们在utils里面创建一个新的js文件 2.新的js文件里面写我们要实现的函数功能 3.把新的函数功能 通过 module.export.对外公开文件名 新文件名 的方式把之前的函数公开到其他他模块 (类似于public 让别的模块可以…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
