当前位置: 首页 > news >正文

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&#xff08;8&#xff09;之适配器&#xff08;bind等&#xff09;整理 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的适配器整理 C之STL的algorithm&…...

部分国企笔试总结

2024.3.30相城区某国企笔试 客观题&#xff0c;30分 类似考公行测题&#xff08;大部分&#xff09;部分计算机专业基础知识&#xff08;仅几题&#xff09; 主观题&#xff0c;70分 网络安全类一道C编程题&#xff1a;用户输入圆半径r&#xff0c;程序计算面积和周长并输出…...

《QT实用小工具·二十二》多种样式导航按钮控件

1、概述 源码放在文章末尾 该项目实现了多种样式的导航按钮控件 可设置文字的左侧、右侧、顶部、底部间隔。 可设置文字对齐方式。 可设置显示倒三角、倒三角边长、倒三角位置、倒三角颜色。 可设置显示图标、图标间隔、图标尺寸、正常状态图标、悬停状态图标、选中状态图标…...

不定长顺序表

一.不定长顺序表的结构: typedef struct DSQList{ int* elem;//动态内存的地址 int length;//有效数据的个数 int listsize;//总容量 }DSQList,*DPSQList; 很明显,为了能实现扩容(否则如何实现再次判满呢?),我们必须要在定长顺序表的基础上增加一个总容量;结构示意图如下: 二…...

5.网络编程-socker(golang版)

目录 一、什么是socket&#xff1f; 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包&#xff0c;拆包 1.什么是粘包&#xff0c;拆包&#xff1f; 2.为什么UDP没有粘包&#xff0c;拆包&#xff1f; 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …...

网格矢量如何计算莫兰指数

网格矢量如何计算莫兰指数 引言 遇到一个问题&#xff0c;计算矢量网格的莫兰指数。 概念解释 莫兰指数 莫兰指数&#xff08;Moran’s Index&#xff09;是一种空间自相关指标&#xff0c;用于衡量空间数据的相似性和聚集程度。它可以用来描述一个区域与其邻近区域之间的属…...

《containerd原理剖析与实战》大模型时代下如何学习云原生

大模型与云原生 近年来&#xff0c;大语言模型的热度可谓是愈发高涨&#xff0c;尤其是今年年初 Sora 的出现&#xff0c;更是让全球再次看到了AIGC 的巨大威力。 Sora 生成实例视频---几头巨大的长毛猛犸踏着积雪的草地而来 在当前大模型流行的时代下&#xff0c;云原生技术…...

【实用工具】使用飞书机器人监控工程日志

1.创建一个飞书群聊&#xff0c;设置-->群机器人-->添加机器人-->自定义机器人-->修改机器人名称-->添加 2.复制webhook地址 3.编写日志请求代码 import logging import requests import json import os from datetime import datetime import time import sub…...

NIKKE胜利女神PC怎么设置中文 手把手教你设置中文教程

这个游戏中的妮姬分四个企业&#xff0c;其中朝圣者这个派别的妮姬很少而且不在愿望单理&#xff0c;朝圣者的所有姐姐都很哇塞&#xff0c;红莲更是其中的大姐大。一般想抽朝圣者只能靠歪或者出限定卡池&#xff0c;举个栗子&#xff0c;我入坑的时候 朝圣者 神罚 是限定卡池&…...

【leetcode面试经典150题】2.移除元素(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…...

实现几何对象按照一定距离向外缓冲

1、首先&#xff0c;确保你已经引入了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》中提出以来&#xff0c;已经彻底改变了自然语言处理&#xff08;NLP&#xff09;领域的面貌。Transformer的核心是自注意力&#xff08;Self-Attention&#xff09;机制…...

go的orm框架-Gorm

官网文档 特点 全功能 ORM 关联 (拥有一个&#xff0c;拥有多个&#xff0c;属于&#xff0c;多对多&#xff0c;多态&#xff0c;单表继承) Create&#xff0c;Save&#xff0c;Update&#xff0c;Delete&#xff0c;Find 中钩子方法 支持 Preload、Joins 的预加载 事务&…...

嵌入式开发学习---(部分)数据结构(无代码)

数据结构 为什么学习数据结构&#xff1f; 1&#xff09;c语言告诉如何写程序&#xff0c;数据结构是如何简洁高效的写程序 2&#xff09;遇到一个实际问题&#xff0c;需要写程序去实现相应功能&#xff0c;需要解决那两个方面的问题&#xff1f; 如何表达数据之间的逻辑规律…...

ChatGPT 之联盟营销

原文&#xff1a;ChatGPT for Affiliate Marketing 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第二章 制定转化对话 制定转化对话是每个营销人员和企业所有者都应该掌握的关键技能。它涉及创建和传递引人入胜的信息&#xff0c;吸引您的受众并激励他们采取行动。…...

1.k8s简介

目录 k8s是什么 k8s不是什么 云原生 微服务 整体式架构与微服务架构 微服务的特性 微服务的优势 k8s是什么 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快…...

go包下载时报proxyconnect tcp: dial tcp 127.0.0.1:80: connectex错误的解决方案

一大早的GoLand就开始抽风了&#xff0c;好几个文件import都红了&#xff0c;于是我正常操作点击提示的sync&#xff0c;但是却报了一堆错&#xff1a; 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框架是如何处理前后端交互的&#xff1f; Vaadin框架处理前后端交互的方式主要基于服务端渲染和事件驱动的编程模型。以下是具体的处理过程&#xff1a; 服务端渲染&#xff1a;Vaadin应用程序的UI组件是在服务器端创建和渲染的。当用户在浏览器中访问应用程序时&#x…...

动态属性的响应式问题和行内编辑的问题

动态属性的响应式问题 通过点击给目标添加动态数据&#xff0c;该数据不具备响应式特性 如下图&#xff1a; 点击编辑&#xff0c;前面的数据框会变成输入框&#xff0c;点取消会消失 // 获取数据 async getList () {const res await xxxthis.list res.data.rows// 1. 获…...

微信小程序第六次课(模块化和绑定事件)

模块化 1.首先 我们在utils里面创建一个新的js文件 2.新的js文件里面写我们要实现的函数功能 3.把新的函数功能 通过 module.export.对外公开文件名 新文件名 的方式把之前的函数公开到其他他模块 &#xff08;类似于public 让别的模块可以…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...

【向量库】Weaviate 搜索与索引技术:从基础概念到性能优化

文章目录 零、概述一、搜索技术分类1. 向量搜索&#xff1a;捕捉语义的智能检索2. 关键字搜索&#xff1a;精确匹配的传统方案3. 混合搜索&#xff1a;语义与精确的双重保障 二、向量检索技术分类1. HNSW索引&#xff1a;大规模数据的高效引擎2. Flat索引&#xff1a;小规模数据…...