C++ Primer笔记——默认移动操作、移动迭代器、左右值引用成员函数、标准库仿函数、function包装器

news2024/11/15 11:08:42

目录

一.P476 合成的移动操作

二.P480 移动迭代器

三.P483 右值和左值引用成员函数

四.P510 标准库定义的仿函数

五.P512 标准库function类型(包装器)


一.P476 合成的移动操作

什么时候会有默认的移动构造和移动赋值函数,需满足以下几点:

①没有定义任何自己的拷贝控制成员

②类中非静态成员可以移动,如果成员是类类型,那该成员要有定义的移动操作。

在没有显式定义移动构造情况下,什么时候类的移动构造将被定义成删除?(移动赋值同理)

①类成员有拷贝构造且未定义移动构造

②类成员没有定义拷贝构造但编译器没有生成默认移动构造

③类成员的移动构造或移动赋值被定义成删除或不可访问

④类析构函数被定义成删除或不可访问

⑤类成员中有const或引用类型

二.P480 移动迭代器

所谓移动迭代器就是解引用该迭代器后得到的是一个右值引用。

C++11定义了一种移动迭代器适配器make_move_iterator()。通过传递给它普通迭代器,返回一个移动迭代器。

使用方式如下:

vector<int> arr = { 1, 2, 3 ,4 };
auto it = make_move_iterator(arr.begin());

使用场景上,一般用于uninitialized_copy函数,可以通过传递移动迭代器使用移动构造函数来构造元素。

vector<int> arr = { 1, 2, 3 ,4 };
int* tmp = new int[64];
uninitialized_copy(make_move_iterator(arr.begin()), make_move_iterator(arr.end()), tmp);

需要注意的是,在使用移动迭代器时,需要确定后续不会再使用该迭代器,因为不能保证函数内部不会修改移动迭代器内右值元素。

三.P483 右值和左值引用成员函数

创建成员函数时,可以在参数列表后添加引用限定符来规定该函数只能由左值还是右值调用。

如果成员函数只能由左值对象调用,那么限定符为&,即this指针只能指向左值。

如果成员函数只能由右值对象调用,那么限定符为&&,即this指针只能指向右值。

举个例子:

class T {
public:
	void func()& //左值引用成员函数
	{
		cout << "左值" << endl;
	}
	void func()&& //重载,右值引用成员函数
	{
		cout << "右值" << endl;
	}
};

T getRightVal() { //返回右值的函数
	return T();
}

int main(void)
{
	T a;
	a.func();
	getRightVal().func();
	return 0;
}

四.P510 标准库定义的仿函数

标准库定义了一些类,重载了小括号,可以在泛型算法中用于替换函数类型参数,即仿函数。

求和:plus<Type>  

内部实现:

T operator() (const T& x, const T& y) const {return x+y;}

示例(其他仿函数类似,不再演示):
transform(first, first + 5, second, results, std::plus<int>());

//将first开始5个元素与second的5个元素相加结果写入results数组中

求差值:minus<Type> 

内部实现:

T operator() (const T& x, const T& y) const {return x-y;}

求积:multiplies<Type> 

内部实现:

T operator() (const T& x, const T& y) const {return x*y;}

求差:divides<Type> 

内部实现:

T operator() (const T& x, const T& y) const {return x/y;}

求余:modulus<Type> 

内部实现:

 T operator() (const T& x, const T& y) const {return x%y;}

求相反数:negate<Type> 

内部实现:

T operator() (const T& x) const {return -x;}

判断是否相等:equal_to<Type>  //是:true,否:false,下同

内部实现:

bool operator() (const T& x, const T& y) const {return x==y;}

判断是否不等:not_equal_to<Type>

内部实现:

bool operator() (const T& x, const T& y) const {return x!=y;}

判断是否大于:greater<Type>

内部实现:

bool operator() (const T& x, const T& y) const {return x>y;}

判断是否大于等于:greater_equal<Type>

内部实现:

bool operator() (const T& x, const T& y) const {return x>=y;}

判断是否小于:less<Type>

内部实现:

bool operator() (const T& x, const T& y) const {return x<y;}

判断是否小于等于:less_equal<Type>

内部实现:

bool operator() (const T& x, const T& y) const {return x<=y;}

求逻辑与:logical_and<Type>

内部实现:

 bool operator() (const T& x, const T& y) const {return x&&y;}

求逻辑或:logical_or<Type>

内部实现:

 bool operator() (const T& x, const T& y) const {return x||y;}

求逻辑非:logical_not<Type>

内部实现:

 bool operator() (const T& x, const T& y) const {return !x;}

五.P512 标准库function类型(包装器)

当使用函数类型作为参数时,如果传入的对象是lambda表达式将无法确定具体的类型,也就无法指定函数类型传递lambda对象。

对此,C++可以使用function模板解决这个问题:

function<函数类型>  //可以用这个function类型表示任意一种同函数类型的调用形式

例:

function<int(string)>  等价于:

int func(string){};    //普通函数

int operator()(string){};    //仿函数的小括号重载

[](string)->int{};    //lambda表达式

示例如下:

可以同时传函数、仿函数、lambda表达式:

//以下这些函数中i无实际作用,仅作为函数参数来演示
class T {
public:
    //仿函数
	void operator()(int i) {
		cout << "FuncT()" << endl;
	}
};

//函数
void Func(int i) {
	cout << "Func" << endl;
}

//参数为函数类型,使用function来测试仿函数、函数、lambda
void test(function<void(int)> f) {
	int i = 10;
	f(i);
}

int main(void)
{
	T a;
	test(a);//传仿函数
	test(Func);//传函数
	test([](int i) {cout << "Lambda" << endl; });//传lambda表达式
	return 0;
}

 


如有错误,敬请斧正

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

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

相关文章

Java设计模式-中介者模式Mediator

介绍 中介者模式&#xff08;Mediator Pattern&#xff09;&#xff0c;用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。中介者模式属于行为型模式&#xff0c;使代…

linux搭建webapp实战

首先介绍下linux&#xff0c;linux因其开源&#xff0c;定制化高&#xff0c;安全等原因&#xff0c;成为了目前web应用部署首选的操作系统&#xff0c;linux操作系统有很多版本&#xff0c;常见的有centos&#xff0c;debian&#xff0c;RHLE&#xff0c;redhat&#xff0c;乌…

【Linux】gcc/g++编译器、make/Makefile自动化构建工具

作者&#xff1a;小卢 专栏&#xff1a;《Linux》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1.gcc/c的概念&#xff1a; 2.程序编译过程详解&#xff1a; 2.1程序编译过程&#xff1a; 2.…

微电网(风、光、储能、需求响应)【Simulink 仿真实现】

目录 1 展现 2 典型几个介绍 2.1 采用PR的三相逆变器电压控制 2.2 太阳能直流微电网系统 2.3 主电网故障时的交流微电网性能 2.4 混合光伏、双馈发电和电池能源的微电网集成 3 写在后面 4 完整资源 1 展现 随便打开一个&#xff0c;就以第一个&#xff08;采用PID的三…

【GD32F427开发板试用】macOS/Linux系统开发环境搭建(开发、编译、烧录、调试)

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;HonestQiao 我日常的工作环境使用的是macOS系统或者Linux系统&#xff0c;万不得已才使用Windows。 GD32官方提供了Keil MDK-ARM和IAR两款工具…

如何使用Dx命令将jar打包成Dex,需要使用D8命令

使用dx打包的完整命令&#xff0c;将D:\ssh1.0.jar打包成MyClass.dex&#xff0c;MyClass.dex将会输出在当前CMD命令窗口的目录下。dx --dex --no-strict --min-sdk-version26 --outputMyClass.dex D:\ssh1.0.jar运行结果&#xff1a;不要使用dx命令&#xff0c;打出来的dex可以…

NestJS 项目实战 技术选型 (文末附视频)

前言 通过上一章的学习&#xff0c;我们了解了网关系统&#xff0c;并且针对要做的功能做了项目架构设计与需求拆解。 那在一个项目正式开发之前&#xff0c;我们还需要做一个技术调研&#xff0c;从开发框架、使用的工具、数据库等等进行一系列的预研&#xff0c;避免在业务…

嘿~ 基于分布式架构的技术交流社区(WhiteHoleV0.7)即将竣工!

文章目录前言项目介绍WhiteHole期望立项作者功能/模块简介用户模块问答模块社区模块博文模块Next前言 拖更&#xff0c;拖延了这么久&#xff0c;耗时超过3个月的项目&#xff0c;WhiteHoleV0.7 版本即将迎来最后的收尾工作。当然考虑到服务成本&#xff0c;和开发进度&#x…

【以太网硬件十九】SGMII到底能不能直接出光模块?

SGMII接口到底能不能直接出光模块&#xff1f;先说结论&#xff1a;我认为可以&#xff0c;但是有限制&#xff0c;此时的光口只支持强制模式&#xff0c;不支持自协商。如果对端是1000base-X接口&#xff0c;对端也需要把自协商关闭才能与SGMII直出的光口建立连接。为什么SGMI…

你是真的“C”——C语言详解求素数n种境界~

详解C语言函数模块知识(下篇&#xff09;&#x1f60e;前言&#x1f64c;必备小知识~&#x1f618;C语言详解《试除法》求解素数&#x1f64c;试除法第一层境界~ &#x1f60a;试除法境界2~&#x1f60a;试除法境界3~&#x1f60a;试除法境界4~&#x1f60a;C语言详解《筛选法》…

为何限制英伟达出售GPU芯片?中国的AI技术领先,让美国怕了

2022年下半年美国突然要求GPU芯片领军者NVIDIA停止对中国出售高端GPU芯片&#xff0c;此举让人疑惑不解&#xff0c;近期日本媒体《日本经济新闻》与荷兰的一家学术信息巨头的分析给出了答案&#xff0c;中国在AI技术上已领先于美国&#xff0c;而NVIDIA的高端GPU芯片有助于中国…

Web端即时通信技术-WebSocket

最近在做项目的时候&#xff0c;遇到了一个前端页面需要实时刷新的功能&#xff0c;一种方法是我们通过短轮询的方式&#xff0c;但这种方式虽然简单&#xff0c;但是无用的请求过多&#xff0c;占用资源&#xff0c;并且如果是对数据要求高较高的场景&#xff0c;就不适用了。…

汽车ECU软件开发之应用层软件与底层软件

随着汽车产品日渐趋向电子化&#xff0c;人们对各类先进的安全系统、高级驾驶辅助系统的接受程度日益提升。而原本昂贵的盲点检测、自动紧急制动等功能的成本下滑&#xff0c;使其快速获得了市场青睐。富士奇美拉研究所&#xff08;Fuji Chimera Research Institute&#xff09…

MySQL算术/比较/逻辑/位/运算符与正则全解

文章目录1. 算术运算符加法与减法运算符乘法与除法运算符求模&#xff08;求余&#xff09;运算符2. 比较运算符等号运算符安全等于运算符不等于运算符非符号类型的运算符空运算符非空运算符最小值运算符最大值运算符BETWEEN AND运算符IN运算符NOT IN运算符LIKE运算符ESCAPEREG…

〖金融帝国实验室〗(Capitalism Lab)v8.2.00官方重大版本更新(2023.01.17正式发布)

〖金融帝国实验室〗&#xff08;CapLab&#xff09;v8.2.00正式发布&#xff01; ————————————— ※v8.2.00更新内容摘要&#xff1a; 1.新增生活服务业&#xff1a;快餐店、比萨店、蛋糕店和咖啡店。 2.可以通过在农场周围购买土地并耕耘来实现产能扩容。 3.…

九龙证券|重磅会议召开,工信部强调推进民爆行业高质量发展

工信部强调推动民爆职业高质量开展&#xff0c;民爆概念股午后拉升。 工业和信息化部举行 民爆职业安全出产视频会议 据工信部网站&#xff0c;1月17日&#xff0c;工业和信息化部举行民爆职业安全出产视频会议。 工业和信息化部副部长徐晓兰表明&#xff0c;部党组对安全出…

【Linux操作系统】环境变量和命令行参数

文章目录一.环境变量1.什么是环境变量&#xff1f;2.windows下配置PATH环境变量的原理3.一览常见的环境变量4.指令方式如何查看环境变量5.PATH-存放系统默认搜索路径的环境变量6.两种方法使运行我们写的可执行程序不带路径二.环境变量和本地变量三.和环境变量相关的命令1.echo:…

元组的操作

1 元组的定义&#xff1a; 元组就是用一对小括号括起来的多个元素的有序集合&#xff0c;个元素之间用逗号隔开。 2 元组的创建&#xff1a; 2.1 使用&#xff08;&#xff09;创建元组对象。例&#xff1a;lt(12,34,"one") 2.2 使用内置方法tuple创建元组对象。…

mysql 为什么说加上了索引,查询速度就快了呢?(文末附视频)

一天&#xff0c;老板跟我们提出说网站访问的速度太慢&#xff0c;要求我们尽快优化一下。我赶快去查询了一下&#xff0c;发现有几条 SQL 查询的时间异常&#xff0c;我相信这个时候很多小伙伴的大脑里浮现出来的第一个解决办法就是&#xff1a;加索引。 那么到底什么是索引呢…

字符加密-C语言实现

任务描述 请编写程序将一串5个字符组成的英文字符串译成密码&#xff0c;规则为&#xff1a;例如&#xff0c;将“China”译成密码&#xff0c;密码规律是&#xff1a;用原来的字母后面第4个字母代替原来的字母。例如&#xff0c;字母A后面第4个字母是“E”&#xff0c;用“E”…