当前位置: 首页 > news >正文

C++ primer超详细讲解泛型算法

初识泛型算法

只读算法

只读取输入范围内的函数,不改变元素,find,accumula也是如此

(1)accumulate算法为求和算法,前两个参数指出求和元素范围,第三个是和的初值,例:

int sum=accumulate(v.begin(),v.end(),0)

(2)操作两个序列的算法

equal算法,确定两个序列是否保存相同的值,将第一个序列的每个元素和第二个序列中的每个元素进行比较,若相同返回true,否则返回false,接受三个参数,前两个表示第一个序列的元素范围,第三个表示第二个序列的首元素

equal(r1.begin(),r1.end(),r2.begin())

写容器算法

(1)拷贝算法

向另一个目的位置迭代器指向的输出序列中的元素写入数据算法。此算法接受三个迭代器,前两个表示一个舒服范围,第三个表示目的序列的起始位置。copy返回目的迭代器的值。

1

2

3

inta1[] = { 0,1,2,3,4,5 };

inta2[sizeof(a1) /sizeof(*a1)];

auto ret = copy(begin(a1), end(a1), a2);

定制操作

lambda表达式

(1)定义

一个lambda表达式表示一个可调用的代码单元,可理解为未命名的内联函数

lambda表达式形式:

[capture list](parameter list) - > return type{function body}

可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体

auto f =[] {return 42}

调用: cout<<f()<<endl;

(2)向lambda传递参数

实参被用来初始化lambda的形参,lambda不能有默认参数

例:

1

2

3

//[](const string &a,const string &b){return a.size()<b.size()}

//调用

sort(w.begin(),w.end(),[](conststring &a,conststring &b){returna.size()<b.size()})

(3)使用捕获列表

一个lambda通过将局部变量包含在其捕获列表中指出将会使用这些变量,捕获列表指引lambda在其内部包含访问局部变量所需的全部信息

例如,找出第一个大于等于给定长度的单词。

函数biggies实现

1

2

3

4

5

voidbiggies(vector<string> &words,vector<string>::size_type sz)

{

auto wc=find_if(words.begin(),words.end(),

[sz](conststring &a){returna.size()>=sz});

}

lambda捕获和返回

(1)值捕获

与传值参数类似,采用值捕获的前提是变量可以拷贝,与参数不同,被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝

1

2

3

4

5

6

7

voidfcun()

{

size_tv1=42;

auto f=[v1]{returnv1;};

v1=0;

auto j=f();

}

由于被捕获变量的值是在lambda创建时拷贝,因此随后对其修改不会影响到lambda内对应的值,上述中j的值为42

(2)引用捕获

1

2

3

4

5

6

7

voidfcun()

{

size_tv1=42;

auto f=[&v1]{returnv1;};

v1=0;

auto j=f();//j为0,f2保存v1的引用,而非拷贝

}

(3)隐式捕获

可以让编译器根据lambda体中的代码推断我们要使用哪些变量,此时应在捕获列表中写一个&或=,&表示采用捕获引用,=表示采用值捕获方式。

1

wc=find_if(w.begin(),w.end(),[=](conststring &s){returns.size>=sz;});

(4)可变lambda

在值拷贝的情况下,lambda不会改变其值,若希望能够改变被捕获的变量的值,则在参数列表首加上mutable关键字。

1

2

3

4

5

6

7

voidfunc()

{

size_tv1=42;

auto f=[vi]()mutable{return++v1;};

v1=0;

auto j=f();

}

一个引用捕获的变量能否可以修改依赖于此引用指向的是一个const还是非const类型

1

2

3

4

5

6

7

voidfc()

{

constsize_tv1 = 42;

auto f = [&v1]()mutable{return++v1; };//无法修改v1

auto j = f();

cout << j << endl;

}

(5)指定lambda的返回类型

默认情况下,如果一个lambda体中包含return之外的任何语句,则编译器假定此lambda返回void。

例如:将一个序列中负数替换为其绝对值

1

transform(v.begin(),v.end(),v.begin(),[](inti){returni<0?-i:i;})

transform接受三个参数,前两个表示迭代器输入序列,第三个表示迭代器目的位置。

上述中,我们无需指定返回类型,因此可以根据条件运算符的类型推断出来。

若改写成存在if语句,则存在错误

1

transform(v.begin(),v.end(),v.begin(),[](inti){if(i<0)return-i;elsereturni;})

编译器发现存在return之外的语句,所以推断其返回类型为void,而他却返回了一个int

正确写法:

1

2

transform(v.begin(),v.end(),v.begin(),

[](inti) ->int{if(i<0)return-i;elsereturni;})

再探迭代器

标准库头文件iterator中还定义了额外几种迭代器,包括如下:

  • 插入迭代器:绑定到一个容器上,向容器插入元素
  • 流迭代器:绑定到输入输出流上,可以用来遍历所关联的IO流
  • 反向迭代器:这些迭代器向后而不是向前移动,forwar_list不存在此迭代器
  • 移动迭代器:移动元素专用
http://www.jsqmd.com/news/895274/

相关文章:

  • Endnote X9文献管理实战:从PubMed/知网批量导入到Word一键排版,保姆级避坑指南
  • C251微控制器设备配置字节设置与优化指南
  • Keil MDK中RTX Event Viewer失效的解决方案
  • 2021年至今GitHub星标增长最快TOP21-25项目深度解析
  • SUMO仿真效率翻倍:用randomTrips.py批量生成多场景车流数据的实战技巧
  • Gzip解压:处理开启了Gzip压缩的响应体,深潜Gzip压缩响应体:Python爬虫进阶实战手册
  • Unity 2022.3 LTS实战:用ShaderGraph+RenderTexture做个刮刮卡,UI交互效果一步到位
  • 深聊叛逆不上学孩子教育机构怎么选,青少年赏识教育优势在哪 - mypinpai
  • 告别Keil的assert报错:三种实战方案深度评测(自定义函数、关闭MicroLIB、配置Retarget)
  • Scrcpy连接阶段避坑指南:SDL事件循环与adb端口映射的常见问题排查
  • Go语言实现高性能本地PII脱敏引擎:3分钟处理780MB日志
  • 基于Groq API与Streamlit构建AI会议记忆助手:从原理到实践
  • 分析口碑好的洋酒柜定制公司,上海酒依酒柜值得推荐 - mypinpai
  • AI代码审查流水线:用AI自动化审查AI生成代码的质量
  • AI CEO 42天零收入实验:自动化创业决策与认知获取全记录
  • FFmpeg API实战:手把手教你用C++调用NVIDIA NVENC,实现H265到H264的精准转码
  • EhViewer开源漫画阅读器:从零开始的5个必知功能与完整使用手册
  • C++迭代器设计模式
  • 别再猜了!用Vivado FIFO的More Accurate Data Counts功能,彻底搞懂First-Word Fall-Through的深度变化
  • WordPress搜索插件对比:SearchWP关键词优化与Queryra AI语义搜索选型指南
  • 智能体身份的双层结构:从表层人设到深层决策内核的工程实践
  • Tableau中COUNTD与FIXED LOD实战:从客户去重到指标工程
  • 伪装移动端:将UA改为手机端,抓取移动版网页数据(通常反爬弱),移动端伪装爬虫实战:突破UA限制,轻松抓取移动版网页数据
  • 基于AI情绪分析与Python的量化交易系统构建与实战反思
  • C语言与C++内存管理超详细分析
  • 告别卡顿!在CIM/UE5大场景中,这几种LOD切换策略到底该怎么选?
  • FPGA图像缩放项目避坑指南:从HLS到纯Verilog,如何选择与移植(以Kintex7为例)
  • 别再只用labelme了!用ENVI 5.3的ROI工具给遥感影像打深度学习标签(附Python转换脚本)
  • 从自建OAuth令牌管理到Auth0 Token Vault:AI应用安全架构演进实践
  • 别只调代码了!STM32F4 USB3300虚拟串口不通?硬件焊接与信号完整性自查清单