Chapter10(泛型算法)--C++Prime笔记

关键:算法通过在迭代器上进行操作来实现类型无关。算法不改变所操作序列的大小。

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

2.泛型算法永远也不会改变底层容器的大小。

3.用一个单一迭代器表示第二个程序的算法都假定第二个序列至少与第一个一样长。

4.插入迭代器:当我们通过一个插入迭代器赋值时,一个与赋值号右侧值相等的元素被添加到容器中。

5.多个算法都提供所谓的拷贝版本。这些算法计算新元素的值,但不会将它们放置在输入序列的末尾,而是创建一个新序列保存这些结果。

6.渭词:是一个可调用的表达式,其返回结果是一个能用作条件的值。

7.lambda表达式:
[捕获列表](参数列表)->return type{function body};
捕获列表是一个lambda所在函数定义的局部变量的列表。
①可以忽略参数列表和返回类型,都是必须包含捕获列表和函数体
②忽略括号和参数列表等价于指定一个空参数列表。
③如果忽略返回类型,假如函数体只有一个return语句,则返回类型从返回的表达式的类型推断而来,否则,其他任何情况,返回类型为void.
④lambda不能有默认参数
⑤捕获列表只用于局部非静态变量,lambda可以直接使用局部static变量和它所在函数之外声明的名字。
⑥隐式捕获:&告诉编译器采用捕获引用方式,=则采用值捕获方式。如果我希望对一部分变量采取值捕获,其他采用引用捕获,可以混合使用隐式捕获和显示捕获。
⑦当我们需要为一个lambda定义返回类型时,必须使用尾置返回类型。

8.标准库函数blind可以将函数适配参数的数量和顺序。blind和ref和cref均在functional头文件中。

9.插入迭代器:
①执行*it,it++,++it之类的操作后不会对迭代器做任何事情,每个操作还是返回it.
②back_inserter:调用push_back.  front_inserter:调用push_front,inserter元素被插入到给定迭代器所表示的的元素之前。
③front_inserter元素总是插入到容器第一个元素之前。因此用copy时,最后目的位置用front——inserter时会使拷贝逆序。

10.iostream迭代器:
如果定义一个iostream迭代器的时候默认初始化迭代器,这样就创建了一个可以作为尾后值使用的迭代器。
例子:
istream_iterator<int>in_iter(cin),eof;
vector<int> vec(in_iter,eof);
这样这个容器vec就是由关联的流中读取数据获得的。

每次向一个out_iter赋值时,写操作就会被提交

11.流迭代器不支持递减运算。

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

13.链表特有版本和通用版本间的一个至关重要的区别就是链表版本会改变底层的容器。
posted @ 2018-07-17 21:44  LyndonMario  阅读(223)  评论(0编辑  收藏  举报