泛型算法

初识泛型

  1. 大多数算法定义在头文件algorithm中。标准库还在头文件numeric中定义了一组数值范型算法。

  2. 那些只接受一个单一迭代器来表示第二个序列的算法,都假定第二个序列至少与第一个序列一样长。

    // v2中的元素数目应该至少与v1一样多
    equal(v1.cbegin(), v1.cend(), v2.cbegin())
  3. 标准库算法对迭代器而不是容器进行操作,因此,算法不能(直接)添加或删除元素。

定制操作

  1. 可调用对象: 对于一个对象或一个表达式,如果可以对其使用调用运算符,则称它为可调用的。即,如果e是一个可调用的表达式,则我们可以编写代码e(args),其中args是一个逗号分隔的一个或多个参数的列表。

    可调用对象主要有函数和函数指针、重载函数调用运算符的类、以及lambda表达式。

    lambda表达式

    一个lambda表达式表示一个可调用的代码单元,可以将其理解为一个未命名的内联函数。与任何函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。但与函数不同,lambda可能定义在函数内部。具有如下形式:

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

    capture list lambda所在函数中定义的局部变量的列表

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

    auto f = [] { return 32};

    此例中,定义了一个可调用对象f,不接受参数,返回42。 lambda的调用方式与普通函数的调用方式相同,都是使用调用运算符

    cout << f() << endl;	// 打印42

    一个lambda只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体中使用该变量。

    当以引用方式捕获一个变量时,必须保证在lambda执行时变量是存在的。

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

  3. 标准库bind函数

再探迭代器

  1. 标准库在头文件iterator还定义了额外的几种迭代器:

    • 插入迭代器: 被绑定到一个容器上,可用来向容器插入元素,
    • 流迭代器: 被绑定到输入或输出流上,可用来遍历所关联的IO流。
    • 反向迭代器: 迭代器向后面移动而不是向前移动,除了forward_list之外的标准库容器都有反向迭代器。
    • 移动迭代器:这些迭代器移动元素,而不是拷贝元素。
  2. 插入迭代器

    有三种类型,差异在于元素插入的位置:

    • back_inserter 创建一个使用push_back的迭代器。
    • front_inserter 创建一个使用push_front的迭代器。
    • inserter 创建一个使用insert的迭代器。
  3. iostream迭代器

    istream_iterator 要读取的类型必须定义了输入运算符>>,与读取数据流绑定,常见操作如下:

ostream_iterator 可以对任何具有输出运算符(<<运算符)的类型定义,当创建一个ostream_iterator迭代器时,可以提供(可选)第二参数,它是一个字符串,在输出每个元素后都会打印此字符串。此字符串必须是一个C风格字符串(即,一个字符串字面常量或一个指向以空字符结尾的字符数组的指针)。必须将ostream_iterator绑定到一个指定的流,不允许空的或表示尾后位置的ostream_iterator。

可以为任何定义了输入运算符(>>)的类型创建istream_iterator对象,同样的,只要类型有输出运算符(<<),就可以为其定义ostream_iterator。

  1. 反向迭代器

泛型算法结构

  1. 算法所要求的迭代器操作可以分为5个迭代器类别。

  2. 对于list和forward_list,应该优先使用成员函数版本的算法而不是通用算法。

  3. splice成员,链表类型定义了splice算法,此算法是链表数据结构所特有的。

  4. 链表特有的操作会改变容器。

[C++ Primer] 泛型算法的更多相关文章

  1. C++ Primer : 第十章 : 泛型算法 之 只读、写和排序算法

    大多数算法都定义在<algorithm>头文件里,而标准库还在头文件<numeric>里定义了一组数值泛型算法,比如accumulate. ●  find算法,算法接受一对迭代 ...

  2. C++ Primer 5th 第10章 泛型算法

    练习10.1:头文件algorithm中定义了一个名为count的函数,它类似find,接受一对迭代器和一个值作为参数.count返回给定值在序列中出现的次数.编写程序,读取int序列存入vector ...

  3. C++ Primer 读书笔记:第11章 泛型算法

    第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数 ...

  4. 【足迹C++primer】30、概要(泛型算法)

    概要(泛型算法) 大多数算法的头文件中定义algorithm在. 标准库也是第一个文件numeric它定义了一套通用算法. #include<iostream> #include<n ...

  5. [C++ Primer] : 第10章: 泛型算法

    概述 泛型算法: 称它们为"算法", 是因为它们实现了一些经典算法的公共接口, 如搜索和排序; 称它们是"泛型的", 是因为它们可以用于不同类型的元素和多种容器 ...

  6. C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构

    STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...

  7. c++ primer 11 泛型算法

    使用泛型算法必须包含头文件#inlucde <algorithm> 标准库还定义一组泛化的算术算法,其命名习惯与泛型算法相同,包含头文件#include <numeric> f ...

  8. C++ Primer笔记6_STL之泛型算法

    1.泛型算法: 大多数算法定义在头文件algorithm中.标准库还在头文件numeric中定义了一组数值泛型算法 仅仅读算法: 举例: find函数用于找出容器中一个特定的值,有三个參数 int v ...

  9. C++ 泛型算法

    <C++ Primer 4th>读书笔记 标准容器(the standard container)定义了很少的操作.标准库并没有为每种容器类型都定义实现这些操作的成员函数,而是定义了一组泛 ...

  10. C++的那些事:容器和泛型算法

    一.顺序容器 1,标准库定义了3种类型的顺序容器:vector.list和deque.它们的差别主要在于访问元素的方式,以及添加或删除元素相关操作运算代价.标准库还提供了三种容器适配器:stack.q ...

随机推荐

  1. Spring Boot 集成 ShardingSphere-JDBC 配置示例

    概述 Apache ShardingSphere‐JDBC 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库. 关系型数据库当今依然占有巨大市场份额,是 ...

  2. oracle 存储过程 for loop 定时任务

    记录. 是这么个事,要实现一个需求,当人员表里的数据有更新后需要告知其他系统更新他们自己的人员数据. 我想了一下,表里是有时间戳字段的,那我只要监听这个时间就行,拿到数据后用存储过程把数据插入到中间表 ...

  3. .net request——server——response学习

    request 1.Request.UrlReferrer 请求来的URL context.Response.ContentType = "image/png"; //动态创建图片 ...

  4. Hadoop:HDFS设计原理

    一.HDFS组成结构 1.NameNode 相当于Master,主要存储文件的元数据(文件名.目录结构.文件属性等),以及每个文件的块列表和块所在的DataNode. 配置副本策略,管理数据库映射信息 ...

  5. AI领域又新增协议: AG-UI

    随着AI的快速发展正在重塑技术生态,协议的演进速度尤为迅猛.一个令人头疼的问题浮现了:不同的AI智能体和前端应用之间就像说着不同语言的人,无法顺畅交流.开发者们需要为每个智能体单独编写接口,维护成本高 ...

  6. 极大提高项目部署的生产力!分享一个半自动化的CICD实现方案

    前言 完全自动化的 CICD 确实好,代码提交后就自动构建自动发布新版本,实现不停机更新的情况下,还能随时回滚,这搁谁不喜欢啊~ 但理想很丰满,现实往往很骨感,不是所有开发/生产环境都具备部署 CIC ...

  7. 前端开发系列012-基础篇之Javascript面向对象(一)

    一. JavaScript的范围 JavaScript的范围:BOM + DOM + ECMAScript BOM BOM即Browser Object Mode,浏览器对象模型. BOM提供了独立于 ...

  8. FastCDC 项目启动玩玩 😁😁😁😁

    我一直想写个轻量级,但是又高性能,能包含各种国外和国产数据库的迁移和同步工具,然后开源. 无奈以前一直没时间,所以一直没干. 但是现在有时间了,昨天就开始干了. 实现的第一个功能是,Oracle 数据 ...

  9. 从 Redis 客户端超时到 .NET 线程池挑战:饥饿、窃取与阻塞的全景解析

    在开发 .NET 应用时,我偶然遇到使用 StackExchange.Redis 作为 Redis 客户端时出现的超时问题.经查验,这些问题往往不是 Redis 服务器本身出了故障,而是客户端侧的配置 ...

  10. ETLCloud遇上MongoDB:灵活数据流,轻松管理

    在当今数字化转型的大潮中,企业面临着数据管理的多重挑战.数据种类繁多.格式各异,传统关系型数据库往往难以满足这些复杂的需求.为了提升数据管理的灵活性与效率,越来越多的企业开始选择NoSQL数据库.而在 ...