第10章 泛型算法

10.1 概述

  1. 范型算法:实现了一些经典算法的公共接口,可用于不同类型的元素、多种类型的容器、其他类型序列。
  2. 迭代器与算法:算法工作于迭代器之上,迭代器令算法不依赖于容器,但依赖于元素类型的操作;算法永远不会执行容器操作,所以不会改变底层容器的大小。

10.2 初识泛型算法

  1. 输入范围:标准库算法通常对一个范围内的元素进行操作,用两个迭代器参数表示左闭右开区间。

10.2.1 只读算法

  1. 只读算法:只读取而不改变元素,最好用常量迭代器;若计划用算法返回的迭代器改变元素值,就要传递非常量参数。

10.2.2 写容器的算法

  1. 写算法:算法不检查写操作,都假定目的位置空间足够大;常见错误有在刚定义的空容器上进行fill_n或其他写操作;保证算法有足够元素空间来容纳输出可用插入迭代器。
  2. 迭代器参数:一些算法读两个序列,不要求容器或元素类型严格匹配,只要求两个序列中的元素能够比较。

10.2.3 重排容器元素的算法

  1. 重排算法:去除容器重复元素的方法是,先调用重排算法sort和unique,再用容器操作erase(因为算法不能执行容器操作,所以用vector的erase成员做来删除操作)。

10.3 定制操作

  1. 定制操作:算法默认使用<或==运算符完成,但允许我们传递任何类型的可调用对象,用自定义操作代替默认运算符。(可调用对象:函数、函数指针、重载了函数调用符()的类、

10.3.1 响算法传递函数

  1. 谓词:返回可转换为bool型的函数,通常用于判定元素关系;根据接受参数个数分为一元谓词和二元谓词。

10.3.2 lambda表达式

  1. lambda:表示一个可调用的代码单元。我们可以理解为一个未命名的内联函数。
  2. lambda表达式:[捕获列表] (参数列表) -> return 返回类型 {函数体};某些时候参数列表和返回类型可省略,捕获列表是一个lambda所在函数中定义的局部变量的列表,通常为空;不能有默认参数。

10.3.3 lambda捕获和返回

  1. 捕获列表:只需捕获局部非静态变量,分为值捕获和引用捕获;值捕获的变量的值是lambda创建时的拷贝,若要改变需要在参数列表后加mutable关键字;引用捕获要保证lambda执行时变量仍存在,是否可变由是否是常量引用而定。
  2. 隐式捕获:让编译器根据lambda体中的代码推断需要使用哪些变量,使用&或=参数表示引用捕获或值捕获;混合使用隐式和显式捕获时,两者捕获方式必须不同。当我们混合使用瘾式和显式时,捕获列表中第一个元素必须是一个&或=。
  3. 可变lambda:想要改变被捕获的变量的值,就必须在参数列表首加上mutable。
  4. lambda返回:lambda体只含有一个return语句可省略返回类型;否则lambda默认将返回void,必须指定返回类型。

10.3.4 参数绑定

  1. bind函数:auto newCallable = bind(callable, arg_list);传给newCallable的参数会按照arg_list中占位符参数的顺序传给callable。
  2. 占位符:形如_n,n为整数;定义在std::placeholders的命名空间。
  3. 绑定引用参数:bind的那些不是占位符的参数默认被拷贝到可调用对象中;希望传递给bind一个对象而不拷贝它,必须使用ref或cref;bind、placeholders、ref都定义在头文件functianal中。

10.4 再探迭代器

10.4.1 插入迭代器

  1. 插入迭代器:back_inserter、inserter、front_inserter调用容器操作push_back、insert、push_front;*it、++it、it++都返回it。

10.4.2 iostream迭代器

  1. 流迭代器:将对应流当作特定类型的元素序列处理;istream_iterator输入,ostream_iterator输出
  2. istream_iterator:空的istream_iterator可作为尾后迭代器;比较两个istream_iterator是否相等必须读取相同类型,如果都是尾后迭代器或绑定到相同的输入则相等
  3. ostream_iterator:it、++it、it++都返回it;推荐使用it,可与其他迭代器的使用保持一致,将来修改更容易。

10.4.3 反向迭代器

  1. 反向迭代器:rbegin指向尾元素、rend指向首前元素;递增操作移动到前一个元素;反向迭代器的base操作可以得到普通迭代器,但正反向迭代器互相转换时指向的是不同元素。

10.5 泛型算法结构

  1. 算法要求的迭代器:输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器;C++标准指明了算法的每个迭代器参数的最小类别,但编译器通常不会报该类错。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 10.1 概述 #include //大部分算法定义 #include <numeric> //数值泛型算法 ...
    龙遁流阅读 571评论 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,500评论 1 51
  • 顺序容器中只定义了添加删除访问等简单操作,用户更多的需求,只能通过泛型算法实现。此类算法称之为"泛型"是因为它们可...
    saviochen阅读 1,078评论 0 4
  • 来,给孩子点套路 文:杨庆瑞 1 最近有朋友说起来小孩子刚入学不久,不好带的问题。 大家讨论:“我们如何让孩子对某...
    杨庆瑞阅读 199评论 0 1
  • 今天是什么日子呢?对,今天是星期四!我们今天一上午都无课。一路上都听着舒服的歌,有温暖的阳光打在身上,感觉僵硬的身...
    可乐可乐可阅读 268评论 0 0