C++常用标准库函数(长期更新中)

C++常用标准库函数

文章目录

<functional>

函数(组件):std::bind() 、std::ref()、std::funcion()

命名空间:placeholders

类模板:greater 和 less

bind()

target = bind(func, argslist)

  • func为可调用对象,bind()返回一个可调用对象,此处target为可调用对象
  • 浅显的可将target视作一个函数,在调用target时,需要满足target(arglist)规则。
  • 换句话说,我们可看做,bind(func,argslist) 相当于给func() 的部分参数设置了临时默认值,使用target来调用func()函数时,只需要补足余下缺少的参数。
  • 通过以下举例来完善理解,某些函数被调用时只允许携带一个传参,这时我们就可以使用bind()帮忙。
void func(int x, int y){cout<<x << " "<< y<< endl;
}
auto target = bind(func, _1, b);
target(a);   // 等价于func(a, b);
  • 以上例子中的_1格式详见,是一种占位符,代表我们需要向target传递某个参数,而这个参数在func中时第_1个参数。
  • 我们也可以使用bind帮忙,让参数的传递顺序有变
// 假设f有五个形参,如此书写,g中的第一个参数将传递到f的第五个参数位,而g中的第二个参数将传递到f的第三个参数位
auto g = bind(f, a, b, _2, c ,_1);
g(X, Y);  // 等价于f(a, b, Y, c, X);
  • bind()拷贝其参数,面对一个不能拷贝的参数时,我们需要用到引用,可用ref()函数帮忙

命令空间:placeholders

该命名空间存放有_n格式的占位符,而placeholders存放在std占位空间,故如果我们没有用using命令时,需要这样书写:std::placeholers::_1

std::ref()

std::ref()用于将对象包装成引用包装器(reference wrapper)。这个函数通常用于将对象作为引用传递给函数或者函数对象,从而允许对该对象进行修改。

需要注意的是,引用包装器并不是引用本身,但可以模拟引用的行为,因此可以安全地传递给接受引用参数的函数。

组件:std::function

std::function是标准库组件,一个强大而灵活的工具。

作用:将可调用对象封装为一个函数对象,提供一种统一的方式来处理各种类型的可调用函数

基本语法

std::function<T(args)> funcname;

示例

#include<iostream>
#include<functional>class MyClass{
public:// 重载()运算法,使MyClass可作为函数调用void operator()() const{std::cout << "MyClass is Callable" << std::endl;}
};void greet(){std::cout << "Hello" << std::endl;
}int main(){// (1)封装函数指针std::function<void()> func1 = greet;func1(); 	// 将调用封装的函数指针,打印"Hello"// (2) 封装lambda表达式std::function<void()> func2 = [](){std::cout <<" Lambda! " <<std::endl;  };func2();    // 调用封装的lambda表达式,打印"Lambda"//封装可调用对象std::function<void()> func3 = MyClass();func3();   // 打印"MyClass is Callable"return 0;
}

组合使用示例:

#include <iostream>
#include <functional>void printMessage(const std::string& message, int value) {std::cout << message << ": " << value << std::endl;
}int main() {std::function<void(int)> func = std::bind(printMessage, "Hello", std::placeholders::_1);func(42);  // 输出 Hello: 42return 0;
}

类模板:greater和less

greaterless都是标准库中的函数对象类模板。

作用:通常用于算法的比较器,用于指定比较顺序。

说明:其重载了()运算法,接受两个参数,比较其大小,返回一个bool值。

  • greater指定: first_para > second_para
  • less指定: first_para < second_para

模板代码如下

template <class T> struct greater {bool operator() (const T& x, const T& y) const {return x>y;}typedef T first_argument_type;typedef T second_argument_type;typedef bool result_type;
};template <class T> struct less {bool operator() (const T& x, const T& y) const {return x<y;}typedef T first_argument_type;typedef T second_argument_type;typedef bool result_type;
};

用途:可以被用作容器的排序谓词,或者传递给一些需要比较器参数的算法。

#include<iostream>
#include<vector>
#include<iterator>
#include<functional>
#include<algorithm>
using namespace std;int main()
{int A[] = {1,4,3,7,10};const int N = sizeof(A) / sizeof(int);vector<int> vec(A, A+N);ostream_iterator<int> output(cout, " ");cout<<"Vector vec contains:";copy(vec.begin(), vec.end(), output);cout<<"\nAfter greater<int>():";sort(vec.begin(), vec.end(), greater<int>());//内置类型从大到小 copy(vec.begin(), vec.end(), output);cout<<"\nAfter less<int>():";sort(vec.begin(), vec.end(), less<int>());   //内置类型小大到大 copy(vec.begin(), vec.end(), output);return 0;
}

模板类:std::hash

作用:提供了一种标准的哈希函数的实现,可以用于各种数据类型的哈希计算

语法:

namespace std {template< class T >struct hash;
}

使用方法:通过模板参数类型T进行特化,可以得到对应类型的哈希函数对象。

// 示例1 针对内置基本数据类型
std::hash<int> hash_fn; // 创建一个hash函数对象int value = 42;
size_t hash_value = hash_fn(value); // 可得到value的hash值// 示例2 对自定义类型进行哈希
struct MyStruct{int a;std::string b;
};// 特化 std::hash 模板,定义哈希函数对象
namespace std{template<>struct hash<MyStruct>{// 重载()运算符size_t operator()(const Mystruct& s) const {size_t hash_a = std::hash<int>{}(s.a);size_t hash_b = std::hash<std::string>{}(s.b);// hash_b << 1 左移一位// ^ 异或运算,相同为0,相异为1return hash_a ^ (hash_b << 1);}};
}

<utility>


参考:

[1] 《C++ Primer(第五版)》 by: Stanly B.Lippman, Josee Lajoie, Barbara E.Moo

[2] 知乎:理解C++ std::function灵活性与可调用对象的妙用

[3] CSDN: Toryci——C++ greater<int>()和less<int>()
see Lajoie, Barbara E.Moo

[2] 知乎:理解C++ std::function灵活性与可调用对象的妙用

[3] CSDN: Toryci——C++ greater<int>()和less<int>()

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

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

相关文章

DevOps的原理及应用详解(七)

本系列文章简介&#xff1a; 在当今快速变化的商业环境中&#xff0c;企业对于软件交付的速度、质量和安全性要求日益提高。传统的软件开发和运维模式已经难以满足这些需求&#xff0c;因此&#xff0c;DevOps&#xff08;Development和Operations的组合&#xff09;应运而生&a…

【JavaScript对象详解】 Day05

JavaScript对象详解 JavaScript 基础 - 第5天对象语法对象属性对象使用属性-查属性-改属性-增属性-删 &#xff08;了解&#xff09; 方法和调用遍历对象遍历数组对象null 内置对象Math属性方法生成任意范围随机数 综合案例随机点名案例猜数字游戏猜数字游戏设定次数生成随机颜…

leetcode-01-[704]二分查找[27]移除元素

一、[704]二分查找 //二分法&#xff1a;有序 //[left,right] 故判定条件为left < right,等于此时有意义&#xff1b; //缩小范围 leftmid1&#xff1b; //right nums.length-1; //不要忘了修改mid 的值class Solution {public int search(int[] nums, int target) {int le…

运维 之 DNS域名解析

前言 我们每天打开的网站&#xff0c;他是如何来解析&#xff0c;并且我们怎么能得到网站的内容反馈的界面呢&#xff1f;那什么是DNS呢&#xff08;DNS&#xff08;DomainNameservice&#xff0c;域名服务&#xff0c;主要用于因特网上作为域名和IP地址相互映射&#xff09;那…

React的表单学习

react的表单的双向绑定 // userState实现计数实例 import {useState} from react// 1.声明一个react的状态 -useState// 2.核心绑定流程//1.通过value属性绑定react状态//2.绑定onChange事件&#xff0c;通过事件参数e拿到输入框最新的值&#xff0c;反向修改到react状态 func…

机器学习与数据挖掘知识点总结(二)之常用的分类算法

目录 1、什么是数据挖掘 2、为什么要有数据挖掘 3、数据挖掘用在分类任务中的算法 朴素贝叶斯算法 svm支持向量机算法 PCA主成分分析算法 k-means算法 决策树 1、什么是数据挖掘 数据挖掘是从大量数据中发现隐藏在其中的模式、关系和规律的过程。它利用统计学、机器学…

Kafka监控系统efak的安装

下载地址Kafka Eaglehttp://download.kafka-eagle.org/下载地址连接不稳定&#xff0c;可以多次尝试直到成功连接下载 1.解压安装包并重命名 tar -zxvf kafka-eagle-bin-3.0.1.tar.gz 查看到解压后包含一个安装包&#xff0c;再解压 tar -zxvf efak-web-3.0.1-bin.tar.gz 移…

【Nacos 2.3.3支持Postgre SQL数据源配置】

Nacos 2.3.3支持Postgre SQL数据源配置 1、Nacos下载2、 插件下载&#xff1a;3、SQL脚本获取、nacos数据库创建、插件编译4、Nacos 集群搭建方式&#xff1a; 1、Nacos下载 下载地址&#xff1a; https://download.nacos.io/nacos-server/nacos-server-2.3.2.zip 或者自行在官…

1.Vue2使用ElementUI-初识及环境搭建

目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址&#xff1a;source-code: 源码笔记 1.下载nodejs v16.x 下载地址&#xff1a;Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…

SpringCloud-OpenFeign拓展-连接池、最佳使用方法、日志输出

目录 1 OpenFeign连接池 1.1 常见连接类型 1.2 连接池使用方法 1.2.1 引入依赖 1.2.2 开启连接池功能 1.2.3 配置完成&#xff0c;重启实例即可&#xff0c;底层将更改设置。 2 OpenFeign最佳使用方法 2.1 每个微服务都是单独的project&#xff0c;内部有三个独立模块 …

林锐C语言--高质量C/C++编程(第十一章其他编程经验)

林锐C语言–高质量C/C编程&#xff08;第十一章其他编程经验&#xff09; 林锐C语言--高质量C/C编程&#xff08;第十一章其他编程经验&#xff09; 林锐C语言--高质量C/C编程&#xff08;第十一章其他编程经验&#xff09;使用 const 提高函数的健壮性总结const作为参数使用用…

Docker:认识镜像仓库及其命令

文章目录 Docker Registry什么是Docker Registry 镜像仓库工作机制使用流程实际使用方法仓库的拉取机制 常用的镜像仓库---DockerHub什么是DockerHub私有仓库 镜像仓库命令docker logindocker pulldocker pushdocker searchdocker logout Docker Registry 什么是Docker Regist…

利用Python分析txt文本中的关键词频率与词汇和句子指标占比

在数据分析和自然语言处理的过程中&#xff0c;关键词的提取和统计是一个重要的步骤&#xff0c;特别是在分析政策文件、经济报告或其他涉及复杂信息的文本时。本文将介绍如何使用Python进行中文文本中的关键词统计&#xff0c;将关注政策相关和不确定性相关的关键词出现频率。…

openi启智社区 aarch64 npu环境安装飞桨paddlepaddle和PaddleNLP(失败)

以前在启智社区都是编译安装飞桨&#xff0c;这回看到飞桨提供了npu安装包&#xff0c;兴冲冲的以为安装很简单。 之所以安装飞桨&#xff0c;是因为想在启智社区的启智大脑调试环境使用最新的PaddleNLP&#xff0c;结果报错&#xff1a;No module named paddle.nn.layer.laye…

编译遇到找不到pcap.so 问题

1.locate 定义pcap.so locate pcap.so 如果存在则打印所有路径 使用软连接将pcap.so 的实际位置连接到编译的lib 目录下 ln -s /usr/lib/x86_64-linux-gnu/libpcap.so /usr/lib/libpcap.so 编译 提示 说明程序中编译的目标程序需要的库与现有的不兼容&#xff0c;一般都是3…

Mysql使用中的性能优化——单次插入和批量插入的性能差异

一般Mysql的客户端和服务端不在一台机器上&#xff0c;所以它们之间的通信需要通过网络进行。我们本次实验&#xff0c;希望抛开网络的影响&#xff0c;测试不同SQL方案在Mysql服务器上的执行效率的对比。于是我们使用“存储过程”来辅助测试。 结论 先上结论&#xff1a; 批…

Servlet基础(续集)

Servlet原理 Servlet是由Web服务器调用&#xff0c;Web服务器在收到浏览器请求之后&#xff0c;会&#xff1a; Mapping问题 一个Servlet可以指定一个映射路径 <servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pa…

vue3 实现自定义指令封装 --- 通俗易懂

1、局部自定义指令 1.1 在<script setup>定义组件内的指令&#xff0c;任何以v开头的驼峰式命名的变量都可以被用作一个自定义指令 <template><div><h3>使用自定义指令</h3><div>########################## start 局部自定义指令</d…

RuoyiAdmin项目搭建及Docker 部署备忘

下载前后分离版&#xff0c;ruoyi: 项目扩展 | RuoYi https://gitee.com/Double_AutoEE/AutoEE 这个是vite antdv 1.安装好后端基础&#xff1a;改端口、配接口、建数据库&#xff0c;前端下载后&#xff1a; npm install npm run dev 2.新建一个模块&#xff0c;包括…

【React】前端插件 uuidjs 的使用 --随机生成id

文档1 文档2 使用 1.安装 npm install uuid2.Create a UUID import { v4 as uuidv4 } from uuid; uuidv4(); // ⇨ 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d3.或使用 CommonJS语法 const { v4: uuidv4 } require(uuid); uuidv4(); // ⇨ 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4…