当前位置: 首页 > 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 让别的模块可以…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...