C++11 玩家不得不学的语法集 [持续更新-建议收藏]

文章目录

      • 1.std::function 开启函数式编程之路
      • 2.std::bind 灵活处理函数调用和传参
      • 3. std::ref 传递引用的必要包装
      • 4.std::thread 标准库的多线程
      • 5.std::packaged_task 封装函数为可异步调用的对象
      • [待续。。。]

1.std::function 开启函数式编程之路

std::function 是 C++ 标准库中的一个模板类,用于封装可调用对象(函数、函数对象、成员函数指针等),并提供一种统一的调用接口。它的主要作用是将可调用对象抽象为一个对象,使得可以像普通对象一样进行传递、存储和调用,从而提高了 C++ 中函数的灵活性和可重用性。

代码:

#include <iostream>
#include <functional>// 函数对象示例
struct Functor {int operator()(int a, int b) const {return a + b;}
};// 普通函数示例
int add(int a, int b) {return a + b;
}// 成员函数示例
class MyClass {
public:int addMember(int &a, int b) const {return a + b;}
};int main() {// 绑定普通函数std::function<int(int, int)> func1 = add;std::cout << "func1 result: " << func1(1, 2) << std::endl;// 绑定函数对象Functor functor;std::function<int(int, int)> func2 = functor;std::cout << "func2 result: " << func2(3, 4) << std::endl;// 绑定 lambda 表达式std::function<int(int, int)> func3 = [](int a, int b) -> int { return a + b; };std::cout << "func3 result: " << func3(5, 6) << std::endl;// 绑定成员函数MyClass obj;int a = 100;std::function<int(const MyClass&, int&, int)> func4 = &MyClass::addMember;a = 1000;std::cout << "func4 result: " << func4(obj, std::ref(a), 8) << std::endl;// 使用 std::placeholders 绑定成员函数std::function<int(const MyClass&, int&, int)> func5 = std::bind(&MyClass::addMember, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);std::cout << "func5 result: " << func5(obj, a, 10) << std::endl;// 使用 std::ref 传递引用int result = 0;std::function<void(int, int)> func6 = [&result](int a, int b) { result = a + b; };func6(11, 12);std::cout << "func6 result: " << result << std::endl;return 0;
}

2.std::bind 灵活处理函数调用和传参

std::bind 是 C++ 标准库中的一个函数模板,用于将函数与其参数绑定起来,生成一个可调用对象。它的主要作用是延迟函数调用,并且可以在调用时提供部分或全部的参数。std::bind 可以用于创建函数对象、绑定成员函数、创建函数适配器等。

代码:

#include <iostream>
#include <functional>// 函数对象示例
int add(int a, int b) {return a + b;
}// 成员函数示例
class MyClass {
public:int addMember(int a, int b) {return a + b;}
};int main() {int a = 1, b = 2 ;// 绑定普通函数auto func1 = std::bind(add, std::ref(a), std::ref(b)); // std::ref 见 std::ref 对应节b = a = 111;std::cout << "func1 result: " << func1() << std::endl;// 绑定成员函数MyClass obj;auto func2 = std::bind(&MyClass::addMember, &obj, std::ref(a), std::ref(b));a=b=1;std::cout << "func2 result: " << func2() << std::endl;// 绑定成员函数并传递额外参数auto func3 = std::bind(&MyClass::addMember, &obj, std::placeholders::_1, std::placeholders::_2);std::cout << "func3 result: " << func3(a, b) << std::endl;// 绑定成员函数的成员auto func4 = std::bind(&MyClass::addMember, &obj, std::placeholders::_1, std::ref(b));b = 2;std::cout << "func4 result: " << func4(a) << std::endl;return 0;
}

3. std::ref 传递引用的必要包装

std::ref 是 C++ 标准库中的一个函数模板,用于将一个对象或者引用包装为一个 std::reference_wrapper 对象,从而使得对象可以像引用一样被传递。std::reference_wrapper 对象可以在函数传参时传递引用,而不是对象的副本,这在某些情况下可以提高程序的效率。诸如:std::bind、std::function

还是不理解的话,举例如下:std::thread 在传入参数时默认为值传递,此时,对要传递的左值使用std::ref(variable) 则可以传递引用进去。示例可见 std::thread。

代码

#include <iostream>
#include <functional>void modify(int& num) {num += 10;
}int main() {int num = 5;// 通过 std::ref 将引用包装成 std::reference_wrapperauto refNum = std::ref(num);// 通过 std::reference_wrapper 传递引用modify(refNum);// 输出修改后的值std::cout << "Modified num: " << num << std::endl;return 0;
}

4.std::thread 标准库的多线程

std::thread 是 C++ 标准库中用于创建线程的类,它提供了一种方便的方式来创建并发执行的线程。

code:

#include <iostream>
#include <thread>
#include <vector>// 线程函数
void threadFunction(int& num) {++num;std::cout << "Hello from thread! Num: " << num << std::endl;
}class Worker {
public:void operator()() const {std::cout << "Hello from worker thread!" << std::endl;}
};int main() {int Num = 1;// 创建一个线程并启动//std::thread t1(threadFunction, Num ); 编译报错//t1.join();std::thread t1_ref(threadFunction, std::ref(Num) );t1_ref.join();std::cout << "Hello from Main thread! Num: " << Num << std::endl;// 创建一个线程并启动,使用 Lambda 表达式int val = 2;std::thread t2([val](){std::cout << "Hello from thread! Value: " << val << std::endl;});// 创建一个线程并启动,使用函数对象Worker worker;std::thread t3(worker);// 等待所有线程结束t2.join();t3.join();// 创建多个线程并启动std::vector<std::thread> threads;for (int i = 0; i < 5; ++i) {threads.emplace_back([i]() {std::cout << "Hello from thread " << i << std::endl;});}// 等待所有线程结束for (auto& thread : threads) {thread.join();}// 获取硬件线程数unsigned int numThreads = std::thread::hardware_concurrency();std::cout << "Number of hardware threads: " << numThreads << std::endl;return 0;
}

5.std::packaged_task 封装函数为可异步调用的对象

std::packaged_task 是 C++ 标准库中的一个类模板,用于将函数封装为一个可调用的对象,并可以异步执行该函数。它通常与 std::future 结合使用,用于获取函数执行结果。

代码:

#include <iostream>
#include <future>
#include <thread>
#include <functional>// 任务函数
int taskFunction(int a, int b) {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作return a + b;
}int main() {// 创建一个 packaged_task,绑定任务函数std::packaged_task<int(int, int)> task(taskFunction);// 获取与 packaged_task 关联的 futurestd::future<int> future = task.get_future();// 启动一个新线程执行任务,并传递参数std::thread t(std::move(task), 1, 2);// 等待任务执行完成并获取结果int result = future.get();// 输出结果std::cout << "Result: " << result << std::endl;// 等待线程结束t.join();// 重新设置 packaged_task 关联的任务函数std::packaged_task<int(int, int)> task2;task2.reset(); // 重置为默认构造函数创建的状态return 0;
}

[待续。。。]

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

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

相关文章

LeetCode 热题 100 题解:普通数组部分

文章目录 题目一&#xff1a;最大子数组和&#xff08;No. 53&#xff09;题解 题目二&#xff1a;合并区间&#xff08;No. 56&#xff09;题解 题目三&#xff1a;轮转数组&#xff08;No. 189&#xff09;题解 题目四&#xff1a;除自身以外数组的乘积&#xff08;No. 238&a…

MySql运维篇

目录 一.日志 1.1日志分类 1.2Error Log 1.3BinaryLog 1.4SlowQuery Log 二.备份 2.1备份原因 2.2备份目标 2.3备份技术 2.3.1物理备份 2.3.2逻辑备份 2.4备份方式 2.4.1完全备份 2.4.2增量备份 2.4.3差异备份 2.5备份环境准备 2.6完全备份实验 2.6.1完全备…

Android 一键唤醒应用

Android 一键唤醒应用 最近收到客户需求&#xff0c;需要设备实现一键唤醒应用功能&#xff0c;本次以录音机为例&#xff0c;一键唤醒应用功能具体修改参照如下&#xff1a; /frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java public…

12.Ribbon饥饿加载

Ribbon默认是懒加载的&#xff0c;第一次使用Ribbon访问的时候才会去实例化对象&#xff0c;所以第一次访问比较耗时。 ribbon:eager-load:enabled: true # 开启饥饿加载clients: user-service #对user-service这个服务饥饿加载 多个微服务的写法&#xff1a; ribbon:eager-loa…

https协议的加密方式详解

各位大佬能多多点赞关注评论收藏&#xff0c;球球各位大佬们了&#xff01;&#xff01; &#xff01; 目录 1.为什么要加密&#xff1f; 2.如何加密 1.密钥&#xff08;yue,第四声&#xff09; 2.对称加密 3.非对称加密 4.公证机构 3.总结 1.为什么要加密&#xff1f;…

点云语义分割:DELA代码解读

论文标题&#xff1a; Decoupled Local Aggregation for Point Cloud Learning 代码地址&#xff1a;https://github.com/Matrix-ASC/DeLA 1. Dataloader 数据导入流程&#xff1a; 预处理得到.pth文件 -> S3DIS类定义 -> 根据配置文件S3DIS类实例化 -> 通过Dataload…

趋势分析 一元线性回归及显著性检验 GIS方法 Slope

slope斜率计算公式&#xff1a; 假设有三年的NDVI图像 加载3年栅格数据&#xff0c;公式中n取3计算分子左边&#xff1a; 3*(1*"1990.tif"2*"1991.tif"3*"1992.tif") 计算分子右边&#xff1a; 6*("1990.tif""1991.tif"&q…

【机器学习算法】穿越神经网络的迷雾:深入探索机器学习的核心算法

目录&#x1f339; 1. 神经元结构&#xff1a;2. 神经网络结构&#xff1a;3. 前向传播&#xff08;Forward Propagation&#xff09;&#xff1a;4. 损失函数&#xff08;Loss Function&#xff09;&#xff1a;5. 反向传播&#xff08;Backpropagation&#xff09;&#xff1…

算法课程笔记——STL题目

长度为2的字符串&#xff0c;当in下标为一&#xff0c;也就是\n,当i&#xff01;n&#xff0c;就是输出空格 &&且 city从citys里面取 加速后就不能混用scanf

货币银行学-货币需求

货币需求 货币需求影响因素货币交易性媒介职能如何影响实际货币需求 货币需求影响因素 货币需求受到以下因素的影响&#xff1a; 实际收入&#xff1a;当实际收入增加时&#xff0c;人们需要更多的货币来进行交易&#xff0c;从而产生了对货币的需求。 利率&#xff1a;利率的…

CoFSM基于共现尺度空间的多模态遥感图像匹配方法--论文阅读记录

目录 论文 Multi-Modal Remote Sensing Image Matching Considering Co-Occurrence Filter 参考论文&#xff1a;SIFT系列论文&#xff0c; SIFT Distinctive Image Features from Scale-Invariant Keypoints&#xff0c;作者&#xff1a;David G. Lowe 快速样本共识算法…

汇智知了堂晨会聚焦:NAS应用如何赋能网络安全实战

在近期汇智知了堂网络安全75班的晨会上&#xff0c;一场关于NAS应用的深入分享完美展开。学员们以饱满的热情投入到这场安全讨论中&#xff0c;共同探索网络安全的新天地。 此次分享会聚焦于NAS的应用&#xff0c;旨在帮助学员们更好地了解NAS的定义与功能&#xff0c;掌握其在…

52.基于SpringBoot + Vue实现的前后端分离-房屋租赁系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的房屋租赁系统设计与实现管理工作系统…

【Linux系统化学习】线程控制

目录 前言 POSIX线程库 线程控制 创建线程 线程终止 pthread_exit()函数 pthread_cancel()函数&#xff08;会在下面线程等待部分详解&#xff09; 线程等待 pthread_join()函数 获取线程退出码 分离线程 线程取消(pthread_cancel()函数&#xff09; 线程ID及进程…

open Gauss 数据库-06 openGauss数据库安全指导手册5.0.0

发文章是为了证明自己真的掌握了一个知识&#xff0c;同时给他人带来帮助&#xff0c;如有问题&#xff0c;欢迎指正&#xff0c;祝大家万事胜意&#xff01; 目录 前言 openGauss数据库安全指导 1 用户权限控制 1.1 实验介绍 1.1.1 关于本实验 1.1.2 实验目的 1.2 用户…

富文本编辑器(wangEdit)+(jquery.wordexport)实现web版在线编辑导出

小插曲&#xff1a;最开始的方向是Html5的contenteditable"true"的文档可编辑属性。只能修改文档文字内容&#xff0c;不能修改样式&#xff0c;如修改字体&#xff0c;字号&#xff0c;颜色等。于是用了第一款&#xff08;quil&#xff09;富文本插件。只能说一般&a…

IEEE PDF eXpress Validating Pdf..之后Error in converting file

在将自己写好的pdf论文转化为IEEE出版的pdf论文格式的时候&#xff0c;错误如下图&#xff1a; 解决办法如下&#xff1a;失败之后&#xff0c;那里有一个选项按钮&#xff0c;叫做manual request&#xff0c;也就是人工转换&#xff0c;点那个申请就可以了&#xff0c;然后也挺…

jdk keytool.exe生成keystore https证书,利用jks2pfx转换nginx证书,nginx配置证书

jdk keytool.exe生成keystore https证书,利用jks2pfx转换nginx证书,nginx配置证书 由于项目需要https访问,使用ngigx配置https证书,在用nginx代理到 各个tomcat,比tomcat直接配置https证书方便,记录下自己制作nginx https证书文件,以及配置的过程. 由于证书不是证书机构颁…

我与C++的爱恋:类和对象(四)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 朋友们大家好&#xff01;本篇是类和对象的最后一个部分。 一、static成员 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之…

头歌实训作业答案c++

由于“头歌实训作业答案C”这个表述可能指的是某个特定课程或机构的C编程作业答案&#xff0c;通常这类作业答案不会公开分享&#xff0c;因为这涉及到版权和学术诚信的问题。但我可以提供一些C编程的通用指导和资源&#xff0c;帮助你完成实训作业。 ### C编程基础 1. **变量…