C++Primer 第十章
//1.标准库算法不仅可以应用于容器,还可以应用于内置数组,指针。 //2.大多数算法都定义在头文件algorithm中。标准库还在头文件numeric中定义了一组数值泛型算法。 //3.算法本身不会改变其操作对象的大小,但是通过插入迭代器,可以间接改变传入容器的大小。 //4.lambda表达式:
// A:一个lambda具有返回类型(必须由尾置返回),一个参数列表,一个函数体。可以定义在函数的内部。
// B:如果lambda的函数体包含任意return之外的语句,则其默认的返回值类型是void
// C:lambda的参数不能具有默认实参
// D:当编写了一个lambda后,编译器将该表达式翻译成一个未命名的类的未命名对象。在lambda产生的类中含有一个重载的函数调用运算符。
// E:默认情况下,lambda不能改变其捕获的变量,因此默认情况下lambda产生的类的函数调用运算符是const函数。如果lambda被声明为可变的时候(使用mutable修饰),则调用运算符就不是const的了。
// F:通过值捕获的变量被拷贝到lambda中,此种lambda产生的类必须为每个值捕获的变量建立对应的数据成员,同时创建构造函数令其使用捕获的变量的当前值来初始化数据成员,此初始化过程发生在lambda声明时而非调用时。
// G:通过引用捕获的变量将由程序保证lambda执行的时候引用所引用的对象确实存在。
// H:类的常量成员函数中的this的类型类似于:const A *const this;此类中存在指针成员int *pValue和引用类型int &valueCopy。则在常量成员函数中,pValue的类型为:int *const pValue; valueCopy的类型为:int &const valueCopy;
// 虽然pValue和valueCopy本身不能被改变,但是*pValue可以改变,valueCopy所引用的对象可以通过valueCopy进行改变。所以在非mutable的lambda中依然可以通过引用捕获改变被引用对象的值。
// I:隐式捕获的方式:&代表引用捕获,=代表值捕获。可以进行混用,但是捕获列表的第一个元素必须是&或者=,且显示捕获的变量的捕获方式必须与隐式捕获方式不同。
// J:默认情况下,对于一个值拷贝的变量,lambda不会改变其值。如果我们希望改变一个被捕获的的变量的值,可以在参数列表后使用关键字mutable。
// K:对于那种只在一两个地方使用的简单操作,lambda表示式是最有用的。当一个操作需要很多语句才能完成,那么最好使用函数。 //5.bind:接受一个可调用对象来生成一个新的可调用对象。其一般搭配占位符使用。占位符(_1到_10)声明在命名空间placeholders,其本身又声明在std中。定义在头文件functional中。 //6.标准库的ref()和cref(),前者返回被调用对象的引用,后者返回被调用对象的const引用。均定义在头文件functional中。 //7.插入迭代器:
// 被绑定在容器上,用于向容器插入元素。
// back_inserter:创建一个使用push_back的迭代器。
// front_inserter:创建一个使用push_front的迭代器。
// inserter:创建一个使用insert的迭代器,接受第二个参数为指向容器的迭代器,元素将插入到此迭代器之前,被创建的迭代器将一直指向其第二个参数。当不是通过此迭代器改变了容器的元素后,此函数创建的迭代器会失效。
// 对于插入迭代器:*it, ++it, it++操作均存在,但是都不对it做任何事情,只是返回it
// 均定义在头文件iterator中,使用时候需要包含命名空间std
using std::back_insert_iterator;
using std::front_insert_iterator;
using std::insert_iterator; deque<unique_ptr<char[]>> deStr;
back_insert_iterator<deque<unique_ptr<char[]>>> it_b= back_inserter(deStr);
it_b = (unique_ptr<char[]>)new char[]();
it_b = (unique_ptr<char[]>)new char[](); front_insert_iterator<deque<unique_ptr<char[]>>> it_f = front_inserter(deStr);
it_f = (unique_ptr<char[]>)new char[]();
it_f = (unique_ptr<char[]>)new char[](); insert_iterator<deque<unique_ptr<char[]>>> it_i = inserter(deStr, deStr.begin() + );
it_i = (unique_ptr<char[]>)new char[]();
it_i = (unique_ptr<char[]>)new char[]();
//deStr中的元素的大小:1 5 4 2 10 9 //8.反向迭代器:
// 递增递减的含义会颠倒过来。基于这一点,在使用算法的时候可以从后向前处理容器的元素。
// reserve_iterator的base成员可以将反向迭代器转为对应的普通迭代器(反向迭代器所指的下一个元素) //9.算法所要求的迭代器的类别:
// 输入迭代器:只读,不写,单遍扫描,只能递增
// 输出迭代器:只写,不读,单遍扫描,只能递增
// 前向迭代器:可读写,多遍扫描,只能递增
// 双向迭代器:可读写,多遍扫描,可递增递减
// 随机访问迭代器:支持所有迭代器运算
// 输入迭代器:必须支持 == != ++ -> 运算符, *操作只会出现在=右侧。输入迭代器不能保证输入迭代器的状态可以保存,即只支持单遍扫描。算法find要求其迭代器是输入迭代器
// 输出迭代器:必须支持 ++ 运算符, *操作只会出现在=左侧。我们只能向一个输出迭代器输出一次。算法copy的第三个参数就是输出迭代器。
// 前向迭代器:可以读写元素,这类迭代器只能在序列中沿一个方向移动,此类迭代器支持输入输出迭代器的所有操作,而且可以对一个元素进行多次读写,可以保存前向迭代器的状态,支持多遍扫描。
// 双向迭代器:可以正向反向读写序列中的元素,支持前向迭代器的所有操作,支持--操作。算法reverse()要求双向迭代器,除了forward_list外的容器都提供符合此要求的迭代器
// 随机访问迭代器:提供常量时间内访问任意元素的能力,支持双向迭代器的所有操作, 支持 < <= > >= + += - -= - [] 运算符。算法sort要求随机访问迭代器。array deque string vector 内置数组指针都是此类迭代器 //10.链表本身的算法比通用版本的算法的性能高很多。
// list1.merge(list2):将list2的元素合并入list1,两个链表必须都是有序的。接受第二个参数谓语来自定义比较操作
// list1.remove(val):将给定值删除,有一个remove_if的版本,将删除令一元谓语成立的元素。
// list.reverse():翻转list中的元素
// list.sort():使用<或者给定的操作来排序元素
// list.unique():删除同一值的连续拷贝,可以接受二元谓语。
// list的splice和splice_after系列函数:都是将给定的序列剪切到指定的迭代器前或者后的操作。 splice [splaɪs] n. 接合
C++Primer 第十章的更多相关文章
- C++ Primer : 第十章 : 泛型算法 之 lambda表达式和bind函数
一.lambda表达式 lambda表达式原型: [capture list] (parameter list) -> retrue type { function body } 一个lambd ...
- C++ Primer : 第十章 : 泛型算法 之 只读、写和排序算法
大多数算法都定义在<algorithm>头文件里,而标准库还在头文件<numeric>里定义了一组数值泛型算法,比如accumulate. ● find算法,算法接受一对迭代 ...
- [c++] Associative Containers
关联容器 和 顺序容器 的本质差别在于: 关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素. Reference: http://www.cnblogs.c ...
- 关于竞赛大佬常用的 static const auto _ = []() 用法解析
前言 在刷Leetcode的时候发现很多运算速度极快的代码都有这一段,所以研究一下. static const auto _ = []() { ios::sync_with_stdio(false); ...
- 【C++】《C++ Primer 》第十章
第十章 泛型算法 一.概述 因为它们实现共同的操作,所以称之为"算法".而"泛型",指的是它们可以操作在多种容器类型上. 泛型算法并不直接操作容器,而是遍历由两 ...
- C++ Primer :第十章 :泛型算法之再探迭代器以及其他算法
除了为每个容器定义的迭代器之外,标准库在头文件<iterator>还定义了额外集中迭代器, 包括: 插入迭代器,这些迭代器被绑定到一个容器上,可以向容器插入元素. 流迭代器, 这些迭 ...
- C primer plus 读书笔记第十章
这一章的标题是数组和指针.指针是C语言的精髓所在,而数组的概念和指针又息息相关,所以放在一起讲. 1.数组 主要内容有:1.1.数组初始化.1.2.指定初始化.1.3.数组赋值.1.4.数组边界.1. ...
- 《C++ Primer Plus 6th》读书笔记 - 第十章 对象和类
1. 过程性编程和面向对象编程 2. 抽象和类 1. 使用类对象的程序都可以直接访问公有部分,但只能通过公有成员函数(或友元函数)来访问对象的私有成员 2. 可以在类声明之外定义成员函数,并使其成为内 ...
- C++ Primer Plus学习:第十章
过程性编程和面向对象编程 面向对象编程(OOP)的特性: 抽象 封装和数据隐藏 多态 继承 代码的可重用性 抽象和类 类是一种将抽象转化为用户定义类型的C++工具,它将数据表示和操纵数据的方法合成一个 ...
随机推荐
- memcached学习笔记6--浅谈memcached的机制 以及 memcached细节讨论
附:请浅谈memcached的机制 答: ①基于C/S架构,协议比较简单 c/s架构,此时memcached为服务器端,我们可以使用如PHP,c++/c等程序连接memcached服务器. memca ...
- mysql安装tcmalloc
TCMalloc(Thread-Caching Malloc)是google-perftools工具中的一个,与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多, ...
- Java多态与C++中多态的实现
大牛的文章,值得拜读http://www.ibm.com/developerworks/cn/java/j-lo-polymorph/ 粘贴过来好多图片丢失了 /(ㄒoㄒ)/~~ 众所周知,多态是面向 ...
- Machine Learning in Action -- Support Vector Machines
虽然SVM本身算法理论,水比较深,很难懂 但是基本原理却非常直观易懂,就是找到与训练集中支持向量有最大间隔的超平面 形式化的描述: 其中需要满足m个约束条件,m为数据集大小,即数据集中的每个数据点fu ...
- 智能手机,医疗诊断,云会议(gotomeeting/citrix)
在诊断领域已出现很多大有希望的创新,它们可能会起到真正的变革作用. 例如,有一种新技术可以让健康护理工作者用一部智能手机拍摄高质量的视网膜图像.这些数码照片像素很高,足以帮助检测白内障.黄斑退化.糖尿 ...
- 【Android测试】【随笔】模拟长按电源键
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5195121.html 起因 昨天群里看到有人问如何实现一个 ...
- WordPress显示备案号
备案时,需要显示备案号,而wordpress默认模板本身不带这个信息,为了更快速应付备案,解决方案如下: 根据wp-config.php的提示 .......... /** * zh_CN本地化设置: ...
- android动态调试samli代码(转)
转载自看雪http://bbs.pediy.com/showthread.php?t=189610,非常感谢原作者分享! 跟踪apk一般的做法是在反编译的smali代码中插入log输出,然后重新编译运 ...
- ASP.NET MVC3更新出错:ObjectStateManager中已存在具有同一键的对象
程序代码: [HttpPost] public ActionResult Edit(Person person) { if (ModelState.IsValid) { Person oldperso ...
- PySe-005-基础环境配置(Win7)
之前的文章讲述了如何在 MacOX 下配置 Python + Selenium2 的 WebUI测试自动化环境配置,敬请参阅 PySe-001-基础环境配置(MacOX). 此文主要讲述如何配置 Py ...