插入迭代器 back_inserter:
back_inserter接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器。当我们通过此迭代器赋值时,赋值运算符会调用push_back将一个具有给定的元素添加到容器中。定义在头文件iterator中。
vector<int> vec;
auto it=back_inserter(vec);//返回一个插入迭代器
*it=42;//赋值调用push_back
向算法传递函数:
我们可以向泛型算法传递自定义的函数(谓词)用来定义我们想要的排序方式。谓词是一个可调用的表达式,其返回结果是一个能用作条件的值。接受谓词参数的算法对输入序列的元素调用谓词。元素类型必须能转换为谓词的参数类型。
bool isShorter(const string &s1,const string &s2)
{
return s1.size()<s2.size();
}
sort(words.begin(),words.end(),isShorter());
lambda表达式:
一个lambda表达式表示一个可调用的代码单元。可以理解为一个未命名的内联函数。一个lambda具有一个返回类型,一个参数列表和一个函数体。形式如下,其中 capture list是一个lambda所在函数中定义的局部变量的列表。lambda必须使用尾置返回来指定返回类型。
[capture list](parameter list)-> return type { function body }
我们可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体。
auto f= [] { return 42; }
向lambda传递参数:
lambda不能有默认参数,一个lambda调用的实参数目永远与形参数目相等。一个lambda实例:
[](const string &a,const string &b) { return a.size() < b.size(); }
使用捕获列表:
一个lambda只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体中使用该变量。
[sz] (const string &a) { return a.size() >= sz; }
在泛型算法使用lambda:
//获取一个迭代器,指向第一个满足size()>=sz的元素
auto wc=find_if(words.begin(),words.end(),
[sz] (const string &a) { return a.size() >= sz; });
lambda 捕获和返回:
值捕获:
采用值捕获的前提是变量可以拷贝。与参数不同,被捕获的变量的值是在lambda**创建时被拷贝,而不是调用时拷贝**。
void fcn()
{
size_t v1=42;
auto f= [v1] { return v1; };
v1=0;
auto j=f();//j=42;
}
引用捕获ÿ