现代C++实战(4)
时间:2022-08-10
本文章向大家介绍现代C++实战(4),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
函数对象
c++98中的函数对象:重载()运算符
struct Add {
Add(int n): n_(n){}
int operator()(x) const {
return x + n_;
}
private:
int n_;
}
Lambda表达式
auto add_2 = [](int x) {return x + 2;};
变量捕获
- 本地变量按值捕获
- & 按引用捕获
泛型Lambda
// 普通泛型函数
template<typename T1, typename T2>
auto sum(T1 x, T2 y) {
return x + y;
}
// 等价的lambda表达式
auto sum = [](auto x, auto y) {
return x + y;
};
bind和functional
plus<>()接受两个参数,bind将2绑定到第二个参数,如果不绑定,则用_1,_2用作占位符
transform(v.begin(), v.end(), v.begin(), bind(plus<>(), _1, 2))
function模板是一个包装
function<int(int, int)> a; // 一个返回值为int,接受两个int参数的function对象
上述function对象,可以接受函数签名为int(int,int)的可调用的对象(lambda表达式,函数指针,函数对象,函数名)
函数式编程
要说清楚什么是函数式编程还是很困难的,不过大概的意思就是,把函数当参数传给其他的函数去执行。
可变模板和tuple
模板参数的个数是不定的,下面是个一般用法
template<typename T, typename ...Args>
inline unique_ptr<T>
make_unique (Args&&... args)
{
return unique_ptr<T>(new T(forward<Args>(args)...));
}
这里用forward是为了保持原有的左右值特性(因为右值引用经过一次传参后会变成左值)
递归用法
求n个数的和,变参
template<typename T>
constexpr auto sum(T x) {
return x;
}
template<typename T1, typename T2, typename... Args>
constexpr auto sum(T1, x, T2, y, Args... args) {
return sum(x + y, args);
}
tuple
thread和future
基于thread的多线程
#include <thread>
#include <iostream>
using namespace std;
void func1() {
this_thread::sleep_for(100ms); // 全局函数
cout << "func1!" << endl;
}
void func2() {
cout << "func2!" << endl;
}
int main() {
thread t1{ func1 };
thread t2{ func2 };
t1.join(); // 必须join或者detach
t2.join();
}
mutex 互斥量
- mutex
- recursive_mutex
- timed_mutex
- recursive_timed_mutex
- shared_mutex
- shared_timed_mutex
lock_gard,mutex的RAII包装类
锁
- unique_lock
- scope_lock
future
#include <thread>
#include <iostream>
#include <future>
using namespace std;
int func1() {
this_thread::sleep_for(100ms);
cout << "func1!" << endl;
return 1;
}
void func2() {
cout << "func2!" << endl;
}
int main() {
auto a = async(launch::async, func1);
this_thread::sleep_for(1s);
cout << "I am waiting now\n";
cout << "Answer: " << a.get() << endl;
}
- async指定执行的方式,launch::async表示异步
- 返回一个future对象,用该对象获取结果
内存模型和atomic
双重检查
看一个单例模式
class Singleton{
public:
static Singleton* instance();
private:
static Singleton* inst_ptr_;
}
如何保证多线程下,inst_ptr_不会被初始化两次?
// 一阶段
// 每次调用都需要加锁
Singleton* Singleton::instance() {
{
lock_guard lock;
if (inst_ptr == nullptr) {
inst_ptr_ = new Singleton();
}
return inst_ptr_;
}
// 二阶段
// 初始化以后就不用枷锁了
Singleton* Singleton::instance() {
if (inst_ptr_ == nullptr) {
lock_guard lock;
if (inst_ptr == nullptr) {
inst_ptr_ = new Singleton();
}
}
return inst_ptr_;
}
volatile
防止编译器“优化”掉对内存的读写
atomic
c++11 对原子对象进行了封装
原子操作:读,写,读-修改-写(读到内存,修改,写回内存)
原文地址:https://www.cnblogs.com/destinyzk/p/16573716.html
- objective-C中如何判断一个类中有没有定义某个方法
- Steve Boswell:智能口罩让PM2.5滚蛋
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(2)
- objective-C中的扩展方法与partial class
- 仿优酷Android客户端图片左右滑动(自动滑动)
- objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?
- objective-C 的内存管理之-实例分析
- Tim Berners-Lee:网络的自由和开放
- android防止内存溢出浅析
- objective-C 的内存管理之-自动释放池(autorelease pool)
- objective-C 的内存管理之-引用计数
- CompoundButton.OnCheckedChangeListener与RadioGroup.OnCheckedChangeListener冲突
- Liora Rosin & Golan Levi:在北京驾车看洛杉矶的落日
- iphone/ipad/itouch进入DFU模式最简单的操作办法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP变量覆盖漏洞小结
- 算法复习 : 插入排序原理,记忆,时间复杂度 (7行java实现)
- PHP代码审计01之in_array()函数缺陷
- 分治思想 : 并归排序与其时间复杂度
- java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式
- 算法系列1 初识算法 算法复杂性模型 算法复杂度的计算
- 树莓派基础实验32:DS1302实时时钟模块实验
- Failed to parse date ["1534467411000"]:Invalid time zone indicator '0'
- 快速排序 : 调优:3亿数据40秒,2亿数据30秒,1亿数据15秒
- Spring系列之新注解配置+Spring集成junit+注解注入
- Spring系列之aAOP AOP是什么?+xml方式实现aop+注解方式实现aop
- 线上工程启动日志不滚动了——通过查看堆栈信息排查的过程(ES批量插入)
- Java中使用方法的注意事项
- 微信小程序转发朋友圈详解
- Error: Protocol error, got "H" as reply type byte