泛型算法

泛型算法

首先我们对泛型算法有一个概念,它是可以操作在任何容器之上,实现共同的操作。大多数算法都是通过遍历由两个迭代器表示的一段元素来实现的。

1.泛型算法本身从不执行容器提供的操作,只是单独依赖迭代器和迭代器操作实现。
2.使用“普通”的迭代器时,算法从不修改基础容器的大小。正如我们看到的,算法也许会改变存储在容器中元素的值,也许会在容器内移动元素,但是,算法从不直接添加或删除元素。

c++泛型算法参数接受的都是迭代器呢?

答:泛型算法:模板写的,全局的,针对所有容器用的,不管泛型算法实现什么功能操作,首先得要获取或者是遍历容器的所有元素,因此的要找到一个统一的方式,用相同的方式可以遍历所有容器,访问容器元素。

	sort(vec.begin(),vec.end());  //升序排序                                     
 	  show(vec);
    //泛型算法 =模板+迭代器+函数对象
    //通过传入函数对象,改变sort的排序方式,降序排序
    sort(vec.begin(),vec.end(),greater<int>());
    find(vec.begin(),vec.end(),50); //vector中查找是否有50这个数字
    reverse(vec.begin(),vec.end());  //翻转
    //升序vec、 找第一个比50大的数字      find_if(first,last,函数对象)
                                                              
    // it=find_if(vec.begin(),vec.end(),bind2nd(greater<int>(),50));
   //函数对象在c++11标准以后的替代品 ,就是lambda表达式
 //lambda就是函数对象   不关注函数对象类型是神魔,不关注名字是什么,    只关注函数对象的operator()运算符重载函数怎莫写?
//lambda表达式

 //[](参数列表)->bool(代码)
 //查找第一个比50大的数
    it=find_if(vec.begin(),vec.end(),[](int a)->bool{return a>50;});

lambda表达式:

<1>根据算法接受一元谓词还是二元谓词,我们传递给算法的谓词必须严格接受一个或两个参数。但如果一个算法只接受一元谓词,但根据实际需求,确实要用到两个参数,这时候就可以利用lambda。
我们可以向一个算法传递任何类别的可调用对象。对于一个对象或者表达式,如果可以对其使用调用运算符即(),则称它为可调用的。可调用对象有:函数、函数指针、lambda表达式、重载了函数调用运算符的类。
lambda介绍:一个lambda表达式表示一个可调用的单元代码。可以将其理解为未命名的内联函数。lambda可能定义在函数内部。
[capture list](parameter list)->return type {function}

capture list是指捕获列表,是在lambda所在函数中国定义的局部变量列表。需要注意的是:我们只对lambda所在函数中定义的(非static)变量使用捕获列表。并且,lambda可以直接使用定义在当前函数之外的名字。与普通函数不同的是,lambda必须使用尾置返回来指定返回类型。在lambda中,可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值