cpp primer笔记070-算法函数

  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;}
	123235234 534^Z123 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.rhkb.cn/news/150063.html

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

相关文章

要体验 AI 编程助手吗?

能不能用 AI 编程辅助写代码&#xff1f; 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术&#xff0c;观点&#xff0c;和项目&#xff0c;并将中国优秀开发者或技术…

【傅里叶梅林图像配准】用于图像配准的傅里叶梅林相位相关性的实现(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

创建型设计模式 原型模式 建造者模式 创建者模式对比

创建型设计模式 单例 工厂模式 看这一篇就够了_软工菜鸡的博客-CSDN博客 4.3 原型模式 4.3.1 概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 4.3.2 结构 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了…

数学建模预测模型MATLAB代码大合集及皮尔逊相关性分析(无需调试、开源)

已知2010-2020数据&#xff0c;预测2021-2060数据 一、Logistic预测人口 %%logistic预测2021-2060年结果 clear;clc; X[7869.34, 8022.99, 8119.81, 8192.44, 8281.09, 8315.11, 8381.47, 8423.50, 8446.19, 8469.09, 8477.26]; nlength(X)-1; for t1:nZ(t)(X(t1)-X(t))/X(t1…

黑豹程序员-架构师学习路线图-百科:CSS-网页三剑客

文章目录 1、为什么需要CSS2、发展历史3、什么是CSS4、什么是SASS、SCSS 1、为什么需要CSS 作为网页三剑客的第二&#xff0c;CSS为何需要它&#xff0c;非常简单HTML只能完成页面的展现&#xff0c;但其做出来的页面奇丑无比。 随着网络的普及&#xff0c;人们的要求更高&…

Linux系统编程系列之线程的信号处理

Linux系统编程系列&#xff08;16篇管饱&#xff0c;吃货都投降了&#xff01;&#xff09; 1、Linux系统编程系列之进程基础 2、Linux系统编程系列之进程间通信(IPC)-信号 3、Linux系统编程系列之进程间通信(IPC)-管道 4、Linux系统编程系列之进程间通信-IPC对象 5、Linux系统…

Stable Signature - 为开源生成式AI 创建的图像 添加水印的新方法

文章目录 关于 Stable Signature 关于 Stable Signature 一种为开源生成式AI创建的图像添加水印的新方法 Stable Signature: A new method for watermarking images created by open source generative AI https://ai.meta.com/blog/stable-signature-watermarking-generativ…

洁净室悬浮粒子:手持式、在线式、便携式粒子计数器如何选择呢?

粒子计数器一般分为手持式、便携式、在线式。每种计数器都有不同的适用场景。 您是否正在考虑为您的洁净室配备新的粒子计数器&#xff1f;有许多选项可能更适合您。 手持式粒子计数器 手持式粒子计数器是一种小型粒子计数器&#xff0c;易于移动&#xff0c;可在洁净室中进行…

VMware Horizon 8 运维系列(二)win10设置共享桌面图标

前言 在win10模板上用管理员帐号安装好软件之后&#xff0c;有的软件快捷图标不会出现在桌面上&#xff0c;有的即使有在桌面上出现&#xff0c;但是当发布云桌面池后&#xff0c;客户端登录的都是不同的域用户&#xff0c;当不同的用户登录系统的时候&#xff0c;很多软件快捷…

因为计算机中找不到mfc140.dll无法启动修复步骤分享

mfc140.dll是Microsoft Foundation Class Library&#xff08;微软基础类库&#xff09;的一个组件&#xff0c;它是许多Windows应用程序&#xff08;尤其是使用MFC编写的程序&#xff09;所必需的动态链接库。MFC&#xff08;Microsoft Foundation Classes&#xff09;是一个用…

Text ‘10/03/2023 14:25:49‘ could not be parsed at index 0

说来也巧, 九月30号发版, 国庆节当天生产就炸了 这种情况很明显, Text ‘10/03/2023 14:25:49’ could not be parsed at index 0 这个日期格式有问题, 但是没有初始化日期格式, fastjson自己猜这个格式是什么 第一个是MM/dd 但是,如果两个格式一样就会出现问题,现在他分不出来…

第二证券:A股反弹已至?9月最牛金股涨超41%

进入10月&#xff0c;作为券商月度战略精华的新一期金股也连续宣布。 从各券商关于十月份的大势研判来看&#xff0c;一些券商达观地认为反弹行情正在打开&#xff0c;也有一些券商认为仍是轰动市。具体配备上&#xff0c;AI、科创相关的标的仍然遭到喜欢&#xff0c;一起不少…

tcpdump(一)基础理论知识

一 抓包分析技术初探 说明&#xff1a; 本篇章跟tcp/ip的知识没有关系,只是讲解tcpdump工具背景补充&#xff1a; 抓包是做报文分析的第一步敬畏心&#xff1a; 隔行如隔山,不要想当然 ① 背景 ② 抓包技术名词 1、捋顺这些技术的来龙去脉甚至八卦;2、这样我们在后续课程…

RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题 + 配置镜像队列——实操型

RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题 配置镜像队列——实操型 1. 准备工作1.1 安装RabbitMQ1.2 简单部署搭建设计1.3 参考官网 2. RabbitMQ 形成集群的方法3. 搭建RabbitMQ集群3.1 部署架构3.2 rabbitmq集群基础知识3.2.1 关于节点名称&#xff08;标识符&a…

磁盘io使用率高问题排查

Linux系统出现了性能问题&#xff0c;一般我们可以通过top、iostat、free、vmstat等命令来查看初步定位问题。其中iostat可以给我们提供丰富的IO状态数据。 1.小文件读写的磁盘性能瓶颈是寻址&#xff08;随机读写性能更差&#xff09;评估标准:TPS 2.大文件读写的磁盘性能瓶颈…

LangChain 摘要 和问答示例

在Azure上的OpenAI端点 注意 OpenAI key 可以用微软 用例【1. 嵌入 &#xff0c;2. 问答】 1. import os import openai from langchain.embeddings import OpenAIEmbeddings os.environ["OPENAI_API_KEY"] "****" # Azure 的密钥 os.environ["OP…

除静电离子风棒的工作原理及应用

除静电离子风棒是一种常见的除静电设备&#xff0c;它的工作原理是通过产生大量的负离子来中和物体表面的静电电荷&#xff0c;从而达到除静电的目的。 静电离子风棒内部装有一个电离器&#xff0c;电离器会将空气中的氧气分子或水分子电离成正、负离子。这些带电的离子在空气…

MATLAB学习

前言 MATLAB是“MATrix LABoratory”的缩写&#xff0c;它是由美国Mathworks公司于1984年推出的一种科学计算软件。 语言及其特点 1.功能强大 (1)运算功能强大。MATLAB是以复数矩阵为基本编程单元的程序设计语言其强大的运算功能使其成为世界顶尖的数学应用软件之一。 (2)功能…

【Overload游戏引擎分析】编辑器对象鼠标拾取原理

Overload的场景视图区有拾取鼠标功能&#xff0c;单击拾取物体后会显示在Inspector面板中。本文来分析鼠标拾取这个功能背后的原理。 一、OpenGL的FrameBuffer 实现鼠标拾取常用的方式有两种&#xff1a;渲染id到纹理、光线投射求交。Overload使用的是渲染id到纹理&#xff0c…

Elasticsearch:ES|QL 查询语言简介

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。 Elastic 将尽最大努力解决任何问题&#xff0c;但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。在目前的 Elastic Stack 8.10 中此功能还没有提供。 Elasticsearch 查询语言 (ES|…