notes/ch10.md
#include <algorithm>或者 #include <numeric>(算数相关)vector<int>::const_iterator result = find(vec.begin(), vec.end(), search_value);find和 accumulate(在numeric中定义,求和)。find_first_of,输入:两对迭代器标记两段范围,在第一段中找第二段中任意元素,返回第一个匹配的元素,找不到返回第一段的end迭代器。cbegin和cend。equal:确定两个序列是否保存相同的值。fill: fill(vec.begin(), vec.end(), 0); 将每个元素重置为0fill_n: fill_n(vec.begin(), 10, 0);back_inserter:
#include <iterator>back_inserter(vec)copy:copy (ilst.begin(), ilst.end(), back_inserter(ivec));copy时必须保证目标目的序列至少要包含与输入序列一样多的元素。sort:
unique:
sort谓词(predicate):
例子:
stable_sort:
stable_sort(words.begin(), words.end(), isShorter);有时可能希望操作可以接受更多的参数。
lambda表达式表示一个可调用的代码单元,可以理解成是一个未命名的内联函数。
形式:[capture list](parameter list) -> return type {function body}。
capture list捕获列表是一个lambda所在函数定义的局部变量的列表(通常为空)。不可忽略。return type是返回类型。可忽略。parameter是参数列表。可忽略。function body是函数体。不可忽略。auto f = [] {return 42;}例子:
find_if:
auto wc = find_if(words.begin(), words.end(), [sz](const string &a){return a.size() >= sz;});for_each:
for_each(wc, words.end(), [](const string &s){cout << s << " ";})lambda时会生成一个新的类类型和该类型的一个对象。lambda生成的类都包含一个对应该lambda所捕获的变量的数据成员,在lambda对象创建时被初始化。size_t v1 = 42; auto f = [v1] {return v1;};。lambda执行时,变量是存在的,auto f2 = [&v1] {return v1;};&(引用方式)或=(值方式)。auto f3 = [=] {return v1;}lambda捕获列表:
| 捕获列表 | 解释 |
|---|---|
[] | 空捕获列表。lambda不能使用所在函数中的变量。一个lambda只有在捕获变量后才能使用它们。 |
[names] | names是一个逗号分隔的名字列表,这些名字都是在lambda所在函数的局部变量,捕获列表中的变量都被拷贝,名字前如果使用了&,则采用引用捕获方式。 |
[&] | 隐式捕获列表,采用引用捕获方式。lambda体中所使用的来自所在函数的实体都采用引用方式使用。 |
[=] | 隐式捕获列表,采用值捕获方式。 |
[&, identifier_list] | identifier_list是一个逗号分隔的列表,包含0个或多个来自所在函数的变量。这些变量采用值捕获方式,而任何隐式捕获的变量都采用引用方式捕获。identifier_list中的名字前面不能使用& |
[=, identifier_list] | identifier_list中的变量采用引用方式捕获,而任何隐式捕获的变量都采用值方式捕获。identifier_list中的名字不能包括this,且前面必须使用& |
lambda表达式更适合在一两个地方使用的简单操作。bind函数:
functional中,可以看做为一个通用的函数适配器。auto newCallable = bind(callable, arg_list);newCallable的时候,newCallable会调用callable并传递给它arg_list中的参数。_n代表第n个位置的参数。定义在placeholders的命名空间中。using std::placeholder::_1;auto g = bind(f, a, b, _2, c, _1);,调用g(_1, _2)实际上调用f(a, b, _2, c, _1)ref函数或者cref函数。back_inserter:创建一个使用push_back的迭代器。front_inserter创建一个使用push_front的迭代器。inserter创建一个使用insert的迭代器。接受第二个参数,即一个指向给定容器的迭代器,元素会被查到迭代器所指向的元素之前。插入迭代器操作:
| 操作 | 解释 |
|---|---|
it=t | 在it指定的当前位置插入值t。假定c是it绑定的容器,依赖于插入迭代器的不同种类,此赋值会分别调用c.push_back(t)、c.push_front(t)、c.insert(t, p),其中p是传递给inserter的迭代器位置 |
*it, ++it, it++ | 这些操作虽然存在,但不会对it做任何事情,每个操作都返回it |
istream_iterator的操作:
| 操作 | 解释 |
|---|---|
istream_iterator<T> in(is); | in从输入流is读取类型为T的值 |
istream_iterator<T> end; | 读取类型是T的值的istream_iterator迭代器,表示尾后位置 |
in1 == in2 | in1和in2必须读取相同类型。如果他们都是尾后迭代器,或绑定到相同的输入,则两者相等。 |
in1 != in2 | 类似上条 |
*in | 返回从流中读取的值 |
in->mem | 与*(in).mem含义相同 |
++in, in++ | 使用元素类型所定义的>>运算符从流中读取下一个值。前置版本返回一个指向递增后迭代器的引用,后置版本返回旧值。 |
ostream_iterator的操作:
| 操作 | 解释 |
|---|---|
ostream_iterator<T> out(os); | out将类型为T的值写到输出流os中 |
ostream_iterator<T> out(os, d); | out将类型为T的值写到输出流os中,每个值后面都输出一个d。d指向一个空字符结尾的字符数组。 |
out = val | 用<<运算符将val写入到out所绑定的ostream中。val的类型必须和out可写的类型兼容。 |
*out, ++out, out++ | 这些运算符是存在的,但不对out做任何事情。每个运算符都返回out。 |
rbegin和rend。| 迭代器类别 | 解释 | 支持的操作 |
|---|---|---|
| 输入迭代器 | 只读,不写;单遍扫描,只能递增 | ==,!=,++,*,-> |
| 输出迭代器 | 只写,不读;单遍扫描,只能递增 | ++,* |
| 前向迭代器 | 可读写;多遍扫描,只能递增 | ==,!=,++,*,-> |
| 双向迭代器 | 可读写;多遍扫描,可递增递减 | ==,!=,++,--,*,-> |
| 随机访问迭代器 | 可读写,多遍扫描,支持全部迭代器运算 | ==,!=,<,<=,>,>=,++,--,+,+=,-,-=,*,->,iter[n]==*(iter[n]) |
alg(beg, end, other args);alg(beg, end, dest, other args);alg(beg, end, beg2, other args);alg(beg, end, beg2, end2, other args);其中,alg是算法名称,beg和end表示算法所操作的输入范围。dest、beg2、end2都是迭代器参数,是否使用要依赖于执行的操作。
_if,接受一个谓词代替元素值。_copy。list和forward_list,优先使用成员函数版本的算法而不是通用算法。list和forward_list成员函数版本的算法:
| 操作 | 解释 |
|---|---|
lst.merge(lst2) | 将来自lst2的元素合并入lst,二者都必须是有序的,元素将从lst2中删除。 |
lst.merge(lst2, comp) | 同上,给定比较操作。 |
lst.remove(val) | 调用erase删除掉与给定值相等(==)的每个元素 |
lst.remove_if(pred) | 调用erase删除掉令一元谓词为真的每个元素 |
lst.reverse() | 反转lst中元素的顺序 |
lst.sort() | 使用<排序元素 |
lst.sort(comp) | 使用给定比较操作排序元素 |
lst.unique() | 调用erase删除同一个值的连续拷贝。使用==。 |
lst.unique(pred) | 调用erase删除同一个值的连续拷贝。使用给定的二元谓词。 |
voidlist和forward_list的splice成员函数版本的参数:
| 参数 | 解释 |
|---|---|
(p, lst2) | p是一个指向lst中元素的迭代器,或者一个指向flst首前位置的迭代器。函数将lst2中的所有元素移动到lst中p之前的位置或是flst中p之后的位置。将元素从lst2中删除。lst2的类型必须和lst相同,而且不能是同一个链表。 |
(p, lst2, p2) | 同上,p2是一个指向lst2中位置的有效的迭代器,将p2指向的元素移动到lst中,或将p2之后的元素移动到flst中。lst2可以是于lst或flst相同的链表。 |
(p, lst2, b, e) | b和e表示lst2中的合法范围。将给定范围中的元素从lst2移动到lst或first中。lst2与lst可以使相同的链表,但p不能指向给定范围中的元素。 |
lst.splice(args)或flst.splice_after(args)