Skip to content

Latest commit

 

History

History
114 lines (84 loc) · 2.96 KB

10泛型算法.md

File metadata and controls

114 lines (84 loc) · 2.96 KB

cppp第十章 阅读笔记

0.提到的算法

描述
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上

1.谓词

给泛型算法的工具,返回结果是一个能用作条件的值

2.lamda

捕获相关


  • 值捕获: 传捕获变量的副本
  • 引用捕获: 传引用
  • 隐式捕获: 方括号里只写"="或"&",表示用到外面的谁就以相应方式自动捕获进来
  • 混合捕获: 方括号中第一个元素为"="或"&",其余元素为对立描述的捕获变量

不过你值捕获进来的都会被const关键字修饰,解除的方法是加上mutable修饰

int valA = 666;
auto func = [valA]() mutable {return valA++;};

这并不是说你可以修改原值,只是可以修改传过来的拷贝。

返回相关


只有一个return时可以自动推算返回类型,它推不出来就得用箭头+返回类型告诉它

auto func = [valA]() -> int {return 10;};

3.bind

//生成一个函数适配器

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

4.再谈迭代器

  • 插入迭代器

    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() 可转换成正向迭代器

  • 迭代器类别

名称 操作
输入迭代器 ==,!=,++,*,->
输出迭代器 ++,* (仅一次)
前向迭代器 所有输入输出,多次读写
双向迭代器 同上,多了个--
随机访问迭代器 比较,+=,-=,两者相减,下标访问

5.算法命名

  • 后缀_if: 把值换成谓词(val -> func)
  • 后缀_copy: 重定向输出(原地到异地)

6.stl链表特有

  • merge 合并(有序穿插合并)
  • splice 链接(硬合并)