cpp primer笔记070-算法函数

news2024/11/18 15:31:44
  1. accumulate的第三个参数的类型决定了函数中使用哪个加法运算符以及返回值的类型,如果返回值是自定义类型,需要使用accumlate,则需要重载运算符,该接口的第三个参数返回的是一个需要处理的数据类型的一个变量。

    std::vector<std::string> v{ "wer","Sdf","sdf" };
    std::string sum = std::accumulate(v.begin(), v.end(), std::string(""));
    std::cout << sum << std::endl;
    
    werSdfsdf
    
  2. fill接受一对迭代器表示一个范围,还接受一个值作为第三个参数,将该范围的所有元素的值初始化为该参数。如果使用fill_n,很可能导致数组越界而产生异常。

    std::vector<std::string> v{ "wer","Sdf","sdf" };
    std::fill(v.begin(), v.end(), "wer");
    for (auto x : v)
    {
    	std::cout << x << " ";
    }
    std::fill_n(v.begin(), v.size(), "2");
    for (auto x : v)
    {
    	std::cout << x << " ";
    }
    
    wer wer wer 2 2 2
    
  3. lambda表达式一般构成部分为一下四种,(注意:lambda表达式不能有默认参数,捕获列表只能用于局部非静态变量,对于局部静态变量和全局变量可以直接使用,如果采取值捕获的方式,则变量可以被拷贝,并且被捕获的变量的值是在lambda创建时拷贝的,而不是调用的时候。若采取引用类型捕获的话,如果引用的变量在lambda表达式被调用的时候已经被销毁,则会产生异常。如果想要改变被捕获的值而不是引用变量,则lambda-specifiers可以是mutable):

    • [captures] &lttparams&gt (params) lambda-specifiers { body }
    • [captures] (params) trailing-return-type { body }
    • [captures] (params) { body }
    • [captures] lambda-specifiers { body }
    • captures:捕获列表,lambda可以把上下文变量以值或者引用的方式捕获,在body中直接使用。
    • tparams模板参数列表:让lambda可以像模板函数一样被调用。
    • params参数列表,相当于函数的产生列表,在C++14之后允许使用auto左右参数类型,可以省略。
    • lambda-specifiers lambda说明符,一些可选的参数,比较常用的的参数包括mutable和exception
    • trailing-return-type返回值类型,一般可以省略掉,由编译器来推导。
    • body函数体,函数的具体逻辑。
      [captures]可以使用的几种常用捕获方式:
    • []什么也不捕获,lambda无法使用所在函数体内任何变量。
    • [=]按值的方式捕获所有变量。
    • [&]按引用的方式捕获所有变量。
    • [=,&a,&b]除了变量a和b按引用捕获,其他按值捕获。(这里如果a不加&号会报错)
    • [&,a,b,c]除了变量a,b,c按值捕获,其他按引用捕获
    • [a,&b,&c]以值的方式捕获a,以引用的方式捕获b和c
    • [this]在成员函数中,可以直接捕获this指针,其实在成员函数中,[=]和[&]也会捕获this指针。
    #include <iostream>
    #include <fstream>
    #include <array>
    #include <vector>
    #include <string>
    #include <exception>
    #include <stack>
    #include <deque>
    #include <numeric>
    class Vector3
    {
    private:
    	double x = 0;
    	double y = 0;
    	double z = 0;
    public:
    	Vector3(double a, double b, double c) :x(a), y(b), z(c) {};
    	const Vector3 operator+(const Vector3& vec) const
    	{
    		return [this](const Vector3& vec)->Vector3
    		{ return { double(this->x + vec.x),double(this->y + vec.y),double(this->z + vec.z) }; }(vec);
    	}
    
    	Vector3& operator=(const Vector3& vec)
    	{
    		auto ptrFunc = [this](const Vector3& vec) ->Vector3& {
    			this->x = vec.x;
    			this->y = vec.y;
    			this->z = vec.z;
    			return *this;
    		};
    		return ptrFunc(vec);
    	}
    	friend void Swap(Vector3& vec1, Vector3& vec2)
    	{
    		[&vec1](Vector3& vec2){
    			Vector3 tempVec = vec1;
    			vec1 = vec2;
    			vec2 = tempVec;
    		}(vec2);
    	}
    	friend std::ostream& operator<<(std::ostream& os, const Vector3 vec)
    	{
    		os << "Vector3 (" << vec.x << ", " << vec.y << ", " << vec.z << ")";
    		return os;
    	}
    };
    int main()
    {
    	Vector3 vec1{ 1.0, 2.0, 3.0 }, vec2{ 4.0, 5.0, 6.0 };
    	std::cout << vec1 << " " << vec2 << std::endl;
    	std::cout << vec1 + vec2 << std::endl;
    	Swap(vec1, vec2);
    	std::cout << vec1 << " " << vec2 << std::endl;
    	return 0;
    }
    
    Vector3 (1, 2, 3) Vector3 (4, 5, 6)
    Vector3 (5, 7, 9)
    Vector3 (4, 5, 6) Vector3 (1, 2, 3)
    
  4. bind函数的第一个参数是一个函数指针,后面的参数是这个函数指针中的参数列表,返回值为一个函数指针,其中_1,_2代表bind中第二个参数,第三个参数。

    using namespace std::placeholders;
    int main()
    {
    	int a = 10, b = 20;
    	auto max = std::bind([](int a, int b, int c) {return a > b ? a : b; }, a, b, _1);
    	std::cout << max(a, b) << std::endl;
    	std::cout << std::bind(max, a, b)(a, b) << std::endl;
    	return 0;
    }
    
  5. iterator头文件定义了额外的一下几种迭代器:

    • 插入迭代器:这些迭代器被绑定到一个容器上,可以用来向容器插入元素。
    • 流迭代器:这些迭代器被绑定到输入或者输出流上,可以用来遍历所有关联的IO流。
    • 反向迭代器:这些迭代器向后移动,而不是向前移动,除了forward_list之外的标准库容器都有反向迭代器。
    • 移动迭代器:这些专用的迭代器不是拷贝其中的元素,而是移动他们。
  6. 插入迭代器包括back_inserter,front_inserter和inserter

    #include <iostream>
    #include <fstream>
    #include <array>
    #include <vector>
    #include <string>
    #include <exception>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <numeric>
    #include <functional>
    int main()
    {
    	std::deque<int> deq1, deq2;
    	auto it = std::back_inserter(deq1);
    	*it = 42;
    	*it = 10;
    	//vec.resize(10);
    	//std::fill_n(vec.begin(), 10, 0);
    	//下面的一行相当于上面的两行,由于插入迭代器自增无效,解引用,
    	//所以fill_n不断让迭代器自增的语句无效,但是赋值语句有效
    	std::fill_n(std::back_inserter(deq1), 10, 0);
    	std::for_each(deq1.cbegin(), deq1.cend(), [](int val) {std::cout << val << " "; });
    	deq1.clear();
    	std::cout << std::endl;
    	for (int i = 0; i < 10; ++i) *it = i;
    	std::copy(deq1.cbegin(), deq1.cend(), std::front_inserter(deq2));
    	std::for_each(deq2.cbegin(), deq2.cend(), [](int val) {std::cout << val << " "; });
    	deq2.clear();
    	std::cout << std::endl;
    	std::copy(deq1.cbegin(), deq1.cend(), std::inserter(deq2, deq2.begin()));
    	std::for_each(deq2.cbegin(), deq2.cend(), [](int val) {std::cout << val << " "; });
    	return 0;
    }
    //给back_inserter赋值相当于push_back,给inserter相当于push_front
    //给front_inserter赋值相当于push_front
    
    42 10 0 0 0 0 0 0 0 0 0 0
    9 8 7 6 5 4 3 2 1 0
    0 1 2 3 4 5 6 7 8 9
    

    ![[Pasted image 20230922214426.png]]

  7. 流迭代器包括istream_iterator和ostream_iterator
    ![[Pasted image 20230922231536.png]]
    ![[Pasted image 20230923000228.png]]

		#include <iostream>
		#include <fstream>
		#include <array>
		#include <vector>
		#include <string>
		#include <exception>
		#include <algorithm>
		#include <stack>
		#include <deque>
		#include <numeric>
		#include <functional>
		int main()
		{
			std::vector<int> vec1;
			std::vector<char> vec2;
			std::istream_iterator<int> ini_it(std::cin);
			std::istream_iterator<int> int_eof;//上一个语句声明了开头
			//,下一个语句只要是类型相同就会声明一个结尾
			std::ifstream in("sdfksjdfk");//从sdfksjdfk文件读取字符串,而不是从这个字符串中读取
			std::istream_iterator<char> str_begin(in);
			std::istream_iterator<char> str_end;
			//std::cout << std::accumulate(ini_it, int_eof, 0) << std::endl;
			//上面的语句会使得ini_it自增不断从输入流读出下一个字符
			while (ini_it!=int_eof)
			{
				auto it = std::back_inserter(vec1);
				*it = *ini_it++;
			}
			std::for_each(vec1.begin(), vec1.end(), [](int val) {std::cout << val << " "; });
			std::cout.put(10);
			while (str_begin != str_end)
			{
				vec2.push_back(*str_begin++);
			}
			for (auto ch : vec2)
			{
				std::cout << ch;
			}
			std::cout << std::endl;
			return 0;
		}
	123
	235
	234 534
	^Z
	123 235 234 534
	#include <iostream>
	#include <fstream>
	#include <array>
	#include <vector>
	#include <string>
	#include <exception>
	#include <algorithm>
	#include <stack>
	#include <deque>
	#include <numeric>
	#include <functional>
	int main()
	{
		std::vector<int> vec{ 1, 2, 34, 45, 5, 32134, 234 };
		std::ostream_iterator<int> out(std::cout, ",");
		for (auto x : vec)
			out = x;
		std::cout << std::endl;
		std::copy(vec.cbegin(), vec.cend(), out);
		std::cout << std::endl;
		return 0;
	}
1,2,34,45,5,32134,234,
1,2,34,45,5,32134,234,
  1. 反向迭代器包括rbegin,rend,crbegin,crend
    #include <iostream>
    #include <fstream>
    #include <array>
    #include <vector>
    #include <string>
    #include <exception>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <numeric>
    #include <functional>
    int main()
    {
    	std::vector<int> vec{ 1, 2, 3, 5, 6, 7, 8, 9 };
    	std::ostream_iterator<int> out(std::cout, ",");
    	for (auto r_iter = vec.crbegin(); r_iter != vec.crend(); ++r_iter)
    	{
    		out = *r_iter;
    	}
    	std::cout.put(10).put(10);
    	std::sort(vec.rbegin(), vec.rend());
    	for_each(vec.cbegin(), vec.cend(), [&out](int val) { out = val; });
    	return 0;
    }
    
    9,8,7,6,5,3,2,1,
    
    9,8,7,6,5,3,2,1,
    
  2. list和forward_list成员函数版本的算法
    ![[Pasted image 20230923092947.png]]

![[Pasted image 20230923093345.png]]

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

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

相关文章

蓝桥等考Python组别十四级001

第一部分&#xff1a;选择题 1、Python L14 &#xff08;15分&#xff09; 运行下面程序&#xff0c;输出的结果是&#xff08; &#xff09;。 d {A: 501, B: 602, C: 703, D: 804} print(d[B]) 501602703804 正确答案&#xff1a;B 2、Python L14 &#xff08;15分…

吃鸡高手必备工具大揭秘!提高战斗力,分享干货,一站满足!

大家好&#xff01;你是否想提高吃鸡游戏的战斗力&#xff0c;分享顶级的游戏作战干货&#xff0c;方便进行吃鸡作图和查询装备皮肤库存&#xff1f;是否也担心被骗&#xff0c;希望查询游戏账号是否在黑名单上&#xff0c;或者查询失信人和VAC封禁情况&#xff1f;在这段视频中…

System Generator学习——使用 AXI 接口和 IP 集成器

文章目录 前言一、目标二、步骤1、检查 AXI 接口2、使用 System Generator IP 创建一个 Vivado 项目3、创建 IP 集成设计&#xff08;IPI&#xff09;4、实现设计 总结 前言 在本节中&#xff0c;将学习如何使用 System Generator 实现 AXI 接口。将以 IP 目录格式保存设计&am…

「专题速递」回声消除算法、低功耗音频、座舱音频系统、智能音频技术、低延时音效算法、手机外放增强算法...

随着多媒体和通信网络技术的持续升级&#xff0c;以及新型音视频应用场景的不断涌现&#xff0c;音频处理技术正朝着更加智能化和沉浸化的方向迅猛发展。人们对音频听觉体验的要求也逐渐提高&#xff0c;无论是在何种场景下&#xff0c;都期望获得更加清晰的声音&#xff0c;并…

吃鸡高手必备!这些技巧帮你提高战斗力!

大家好&#xff01;作为一名吃鸡玩家&#xff0c;我们都想提高自己的战斗力&#xff0c;享受顶级游戏作战干货&#xff0c;装备皮肤库存展示和查询&#xff0c;并避免被骗游戏账号。在这里&#xff0c;我将为大家介绍一些实用的技巧和工具&#xff0c;让你成为吃鸡高手&#xf…

三相逆变器下垂控制双机

下垂控制的原理推荐看这篇知乎&#xff08;形象又生动&#xff09;&#xff1a;https://www.zhihu.com/question/41003509/answer/518837491 主拓扑图 控制主要模块 Droop子模块 监控有功结果 1、从两台逆变器输出的有功功率波形可以看到&#xff0c;在负载突变的时候&#xf…

卷积网络的发展历史-AlexNet

简介 2012 年&#xff0c;Krizhevsky 与 Hinton 推出了 AlexNet&#xff0c;引起了许多学者对深度学习的研究&#xff0c;可以算是深度学习的热潮的起始标志。在图像分类领域不得不提的就是ImageNet大规模视觉挑战赛(ILSVRC)&#xff0c;它被称为深度学习在图像分类任务研究方…

《Spring框架原理》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

杂记 define,typedef,static,memset,ifndef,递归,逻辑与,整型提升,算术转换

目录 常量&#xff0c;define typedef static ​编辑​编辑 #define定义常量和宏 指针 ​编辑 操作系统&#xff0c;网络 system执行系统命令 memset ifndef 递归 冒泡排序 单目操作符 逻辑与&& 隐式类型转换 整型提升 算术转换 有符号无符号所占的…

网络架构中PHY芯片可否不使用网络变压器/网络隔离变压器连接呢?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;常有人询问网络架构中&#xff0c;PHY芯片通常使用的网络变压器&#xff08;也叫网络隔离变压器&#xff09;可否节省不用&#xff0c;以降低成本&#xff0c;今天就相关问题做个探讨&#xff1b; 一 &#xff0c;P…

吃鸡达人必备!提高战斗力、分享干货、查询安全!

大家好&#xff01;作为吃鸡玩家&#xff0c;想必大家都希望能够提高自己的游戏战斗力&#xff0c;分享顶级游戏作战干货&#xff0c;并且方便进行作图、查询装备皮肤库存&#xff0c;更重要的是&#xff0c;防止被骗游戏账号进入黑名单。今天&#xff0c;我就给大家介绍一家专…

vue.js 生命周期

在页面首次加载执行顺序有如下&#xff1a; beforeCreate //在实例初始化之后、创建之前执行created //实例创建后执行beforeMounted //在挂载开始之前调用filters //挂载前加载过滤器computed //计算属性directives-bind //只调用一次&#xff0c;在指令第一次绑定到元素时调…

MySQL语句大总结

基础语法数据库约束复杂语法1&#xff1a;聚合查询&#xff08;所谓聚合计算聚合函数的结果&#xff09;2&#xff1a;联合查询什么是内连接&#xff1b;什么是外连接&#xff1f;3&#xff1a;子查询&#xff08;套娃,慎用&#xff09;4&#xff1a;合并查询 基础语法 建库 c…

如何使用 Hotshot 通过文字生成 GIF 动画

Hotshot 是一个基于人工智能的工具&#xff0c;可用于通过文字生成 GIF 动画。该工具使用最新的图像生成技术来创建逼真的动画&#xff0c;即使是复杂的文字描述也能做到。 hotshot访问地址 使用 Hotshot 生成 GIF 动画 要使用 Hotshot 生成 GIF 动画&#xff0c;您需要首先…

吃鸡高手亲授:玩转绝地求生,分享顶级游戏干货!

绝地求生&#xff08;PUBG&#xff09;自上线以来&#xff0c;成为了全球热门游戏。作为吃鸡行家&#xff0c;我将分享一些独家技巧和干货&#xff0c;帮助您提高游戏战斗力&#xff0c;享受顶级游戏作战体验&#xff01; 首先&#xff0c;让我们谈一谈战斗力升级。想要在吃鸡游…

卷积网络的发展历史-LeNet

简介 LeNet是CNN结构的开山鼻祖&#xff0c;第一次定义了卷积神经网络的结构。 LeNet模型包含了多个卷积层和池化层&#xff0c;以及最后的全连接层用于分类。其中&#xff0c;每个卷积层都包含了一个卷积操作和一个非线性激活函数&#xff0c;用于提取输入图像的特征。池化层…

FreeRTOS入门教程(队列详细使用示例)

文章目录 前言一、队列基本使用二、如何分辨数据源三、传输大块数据总结 前言 上篇文章我们已经讲解了队列的概念和队列相关的API函数&#xff0c;那么本篇文章的话就开始带大家来学习使用队列。 一、队列基本使用 这个例子将会创建三个任务&#xff0c;其中两个任务用来发送…

Netty(四)NIO-优化与源码

Netty优化与源码 1. 优化 1.1 扩展序列化算法 序列化&#xff0c;反序列化主要用于消息正文的转换。 序列化&#xff1a;将java对象转为要传输对象(byte[]或json&#xff0c;最终都是byte[]) 反序列化&#xff1a;将正文还原成java对象。 //java自带的序列化 // 反序列化 b…

互联网Java工程师面试题·Memcached 篇·第二弹

目录 10、memcached 如何实现冗余机制&#xff1f; 11、memcached 如何处理容错的&#xff1f; 12、如何将 memcached 中 item 批量导入导出&#xff1f; 13、如果缓存数据在导出导入之间过期了&#xff0c;您又怎么处理这些数据呢&#xff1f; 14、memcached 是如何做身份…

3. 安装lombok maven镜像设置

安装lombok & maven镜像设置 一、maven镜像设置 Maven:负责进行项目管理、依赖工具管理的 软件。 快捷解决方案&#xff1a; 1.方法一 直接配置系统默认的文件 各个人因为登录的用户名不同&#xff0c;所以目录名不同。 2.方法二 自定义本地仓库的位置 完成之后重新打…