名 | 描述 |
---|---|
find(begin,end,elm); | 找elm,返回迭代器,没找到返回end |
count(begin,end,elm); | 数一数有多少个elm |
accumulate(begin,end,prv); | begin到end做和,prv做初始值 |
equal(Abegin,Aend,Bbegin); | 容器A从begin到end是否与B从begin开始一样 注:要求A不长于B |
fill(begin,end,val) | 猜 |
fill_n(begin,size,val) | 再猜 |
replace(begin,end,valA,valB) | begin到end所有valA替换成ValB |
replace_copy(begin,end,insert_itr,valA,valB) | begin到end所有valA替换成ValB,插入到insert_itr上 |
给泛型算法的工具,返回结果是一个能用作条件的值
- 值捕获: 传捕获变量的副本
- 引用捕获: 传引用
- 隐式捕获: 方括号里只写"="或"&",表示用到外面的谁就以相应方式自动捕获进来
- 混合捕获: 方括号中第一个元素为"="或"&",其余元素为对立描述的捕获变量
不过你值捕获进来的都会被const关键字修饰,解除的方法是加上mutable修饰
int valA = 666;
auto func = [valA]() mutable {return valA++;};
这并不是说你可以修改原值,只是可以修改传过来的拷贝。
只有一个return时可以自动推算返回类型,它推不出来就得用箭头+返回类型告诉它
auto func = [valA]() -> int {return 10;};
//生成一个函数适配器
int func(int a, int b, int c);
auto funcA = bind(func,666,_1,666);
// funcA(elm) = func(666,elm,666)
auto funcB = bind(func,_3,_2,_1);
// funcB(a,b,c) = func(c,b,a)
int print(ostream &os);
auto funcC = bind(print,ref(cout));
// 绑定引用,常引用用cref
//注:_1 代表 std::placeholders::_1
-
插入迭代器
back_inserter, front_inserter, inserter
可直接用等号执行对应的插入操作,++,--,*三种操作都返回原对象
其中inserter 会在指定位置之前插入元素
-
流迭代器
istream_iterator,ostream_iterator
//echo int
istream_iterator<int> int_it(cin);
istream_iterator<int> int_eof;
while(int_it != int_eof){
cout << (*int_it++) << endl;
}
//还有更骚动操作
istream_iterator<int> int_it(cin),int_eof;
vector<int> nums(int_it,int_eof);
//istream_iterator 默认懒惰,不读不损失数据
ostream_iterator<int> int_out(cout);
ostream_iterator<int> int_out_line(cout,"\n");
//输出完了再输出一个字串,比如这样就是换行
-
反向迭代器
ritr.base() 可转换成正向迭代器
-
迭代器类别
名称 | 操作 |
---|---|
输入迭代器 | ==,!=,++,*,-> |
输出迭代器 | ++,* (仅一次) |
前向迭代器 | 所有输入输出,多次读写 |
双向迭代器 | 同上,多了个-- |
随机访问迭代器 | 比较,+=,-=,两者相减,下标访问 |
- 后缀_if: 把值换成谓词(val -> func)
- 后缀_copy: 重定向输出(原地到异地)
- merge 合并(有序穿插合并)
- splice 链接(硬合并)