泛型算法

本文介绍了泛型算法中的迭代器使用,如back_inserter、front_inserter和inserter,以及如何向算法传递自定义函数和lambda表达式。详细讨论了lambda表达式的捕获方式、返回类型以及如何与标准库的bind函数配合使用。同时阐述了反向迭代器的概念及其在处理容器中的行为。最后,讲解了算法参数模式和命名规范。
摘要由CSDN通过智能技术生成

插入迭代器 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;
}

引用捕获ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值