(十)泛型算法

来源:互联网 发布:2017年6月进出口数据 编辑:程序博客网 时间:2024/06/06 12:42

泛型算法在第二序列只有一个参数的时候,不检查长度是否满足第一个序列,交由程序员负责,危险


可调用对象:函数,函数指针,重载了调用运算符的类(那不是初始化?),lambda表达式(简易函数,或简易类).

lambda表达式,作用为简易函数,通常为内联,并且可以定义在函数内部,可以没有名字.但需要包含基本的返回类型,参数列表,函数体.

[捕获列表](参数列表) -> 尾置返回类型 { 函数体 }

lambda 要求返回类型使用 尾置返回类型

捕获列表是lambda所在函数中定义的局部变量的列表,即lambda可以使用所在函数中定义的局部变量,只需要在捕获列表中声明即可.在lambda被创建时,使用捕获列表初始化lambda类型的数据成员.(表现如此,本质待考证!),需要注意的是在创造lambda时捕获,而非在调用时.

如果我们以引用方式捕获一个变量,我们要确保调用lambda时,这个变量还是存在的.

可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体.捕获列表不能省略的理由其实是为了区分语法,识别lambda表达式,lambda不能有默认参数

auto f = [] {return 42}; //没有参数,可以省略//返回类型可以自动推断,只适合只有单条return 语句中,如果有return以外其他语句则需要显示说明返回类型


捕获列表可以自动推断,方法是在列表中使用 = 值,&引用.当混合使用隐士捕获和显示捕获时,捕获列表中的第一个元素必须是一个&或= 指定了默认的捕获方式.而显示捕获必须使用与隐式捕获不同的方式.


参数绑定 标准库 bind函数

auto check6 = bind(fnCheck, _1, 6);string s = "hello";bool b1 = check6(s);//check6 会返回 fnCheck(s, 6);

ref返回一个对象,包含给定的引用

ref(os);


iostream迭代器,将流读取转化为自增

istream_iterator<int> in_iter(cin), eof;

vector<int> vec(in_iter, eof);//- - 可以用来初始化构造,当然是运行时初始化

任何类型对象定义了>>运算符,就可以创建 istream_iterator 对象,只要类型定义了<<,就可以为其定义ostream_iterator.


反向迭代器,rbegin指向最后一个元素,rend指向第一个元素之前的元素,不论反向迭代器还是正常迭代器,begin第一个迭代器指向的元素都是存在的,而不是之前或之后的元素,即相同的反向与原迭代器指向的不是相同的元素.


0 0
原创粉丝点击