当前位置: 首页 > news >正文

废品回收网站怎么做网站优化重庆百度快照优化

废品回收网站怎么做网站优化,重庆百度快照优化,网页设计师主要工作内容,推广普通话的顺口溜文章目录 What什么是?How什么时候用?如何用?bind1st和bind2nd的底层实现原理my_find_if分析myBind1st分析 What什么是? bind1st 和bind2nd分别是一个用来绑定函数对象的第一个参数或第二个参数的适配器。它在 C98 和 C03 标准中很…

文章目录

  • What什么是?
  • How什么时候用?如何用?
  • bind1st和bind2nd的底层实现原理
    • my_find_if分析
    • myBind1st分析

What什么是?

bind1st 和bind2nd分别是一个用来绑定函数对象的第一个参数或第二个参数的适配器。它在 C++98 和 C++03 标准中很常用,但从 C++11 开始,这个功能已经被认为是过时的(deprecated),并在后续的 C++17 标准中被完全移除。
作用就是:
绑定器 + 二元函数对象 ==> 一元函数对象

他俩只能应用于二元函数对象

How什么时候用?如何用?

下叙函数的代码流程为:
定义一个模板函数showContainer来打印任意类型的容器;

随机生成一个数组;

我们对其进行排序,首先使用默认排序less;随后使用重载的sort函数,丙通过greater从大到小排序;(其中lessgreater都是二元谓词)

我们现在有一个需求:
把70按顺序插入到vec容器当中 找第一个小于70的数字
很明显我们现在只需要一个一元谓词,但是greater和less都是二元谓词,这怎么办呢?使用绑定器!

绑定器的作用就是:
绑定器 + 二元函数对象 ==> 一元函数对象

//略去了头文件和命名空间的导入
//...template<typename Container>
void showContainer(Container &con) {typename Container::iterator it = con.begin();for (; it != con.end(); ++it) {cout << *it << " ";}cout << endl;
}int main () {vector<int> vec;srand(time(nullptr));for (int i = 0; i < 20; ++i) {vec.push_back(rand() % 100 + 1);}showContainer(vec);sort(vec.begin(), vec.end()); //默认递增排序showContainer(vec);//greater是一个二元函数对象,从大到小排序sort(vec.begin(), vec.end(), greater<int>());showContainer(vec);/*把70按顺序插入到vec容器当中 找第一个小于70的数字需要一个一元函数对象,也就是operator()(const T &val)greater    a > bless       a < b绑定器 + 二元函数对象 ==> 一元函数对象bind1st: + greater bool operator()(70, const _Tp& __y) constbind2nd: + less    bool operator()(const _Tp& __x, 70) const*///auto it1 = find_if(vec.begin(), vec.end(), //bind1st(greater<int>(), 70));auto it1 = find_if(vec.begin(), vec.end(), bind2st(less<int>(), 70));if (it1 != vec.end()) {vec.insert(it1, 70);showContainer(vec);}
}

bind1st和bind2nd的底层实现原理

我们这里首先实现STL标准库中的算法find_ifmy_find_if
然后实现myBind1st
main函数结构如下:

int main () {vector<int> vec;srand(time(nullptr));for (int i = 0; i < 20; ++i) {vec.push_back(rand() % 100 + 1);}showContainer(vec);//greater是一个二元函数对象,从大到小排序sort(vec.begin(), vec.end(), greater<int>());showContainer(vec);auto it1 = my_find_if(vec.begin(), vec.end(), myBind1st(greater<int>(), 70));//auto it1 = my_find_if(vec.begin(), vec.end(), //bind2st(less<int>(), 70));if (it1 != vec.end()) {vec.insert(it1, 70);showContainer(vec);}return 0;
}

my_find_if分析

auto it1 = my_find_if(vec.begin(), vec.end(), myBind1st(greater<int>(), 70));

在STL标准库的find_if,可以看到返回类型是一个迭代器类型传参是容器的开始和结束位置的迭代器最后传入的是一个一元谓词。查找的流程就是遍历指定的范围,碰到符合条件的即返回

template<typename Iterator, typename Compare>
Iterator my_find_if(Iterator first, Iterator last, Compare cmp) {for (; first != last; ++first) {if (cmp(*first)) {  //cmp.operator() (*first)小括号运算符重载return first;}}return last;
} 

myBind1st分析

首先我们要搞清楚bind1st的传参和返回值:

bind1st(greater<int>(), 70)

传入的是一个二元函数对象和具体的数值,返回值其实就是一个一元函数对象,所以我们可以模拟出:

// myBind1st(greater<int>(), 70))
template<typename Compare, typename T>
_mybind1st<Compare, T> myBind1st (Compare cmp, const T &val) {// 直接使用函数模板,好处是可以进行类型的推演return _mybind1st<Compare, T>(cmp, val);
}

我们再来实现这个_mybind1st:

template<typename Compare, typename T>
class _mybind1st {  //绑定器是函数对象的一个应用
public:_mybind1st(Compare cmp, T val):_cmp(cmp), _val(val){}bool operator() (const T &second) {	//重载函数调用运算符return _cmp(_val, second);}
private:Compare _cmp;T _val;
};

这样我们就可以愉快得使用啦

http://www.shuangfujiaoyu.com/news/23166.html

相关文章:

  • 光谷做网站推广哪家好营销方式有哪几种
  • 烟台seo网站诊断b2b免费发布网站大全
  • 巴中网站建设搜索引擎优化培训免费咨询
  • 网站客户端制作互联网营销的五个手段
  • 北京北京网站建设优化大师有必要安装吗
  • 千图网素材免费搜索引擎seo如何优化
  • wordpress重新安装博客怎么搬家厦门seo推广公司
  • 不用网站做淘宝客网店代运营收费
  • 杭州市富阳区建设局网站靠谱的代写平台
  • 珠海哪家做企业网站公司好网络营销的概念及特点
  • 内网电脑做网站seo工作是什么意思
  • 电影网站是怎么做的全球网络营销公司排名
  • 网站开发功能简介广州网站排名优化公司
  • 惠州做棋牌网站建设有哪些公司seo优化包括
  • 菜鸟建网站网络推广网站的方法
  • 国外企业建站深圳搜索引擎优化收费
  • 400电话单页网站51趣优化网络seo工程师教程
  • wordpress 云储存插件苏州seo安严博客
  • 怎么做网站seo优化军事新闻最新24小时
  • 做复刻手表的网站世界互联网峰会
  • 华茂达建设集团网站广东的seo产品推广服务公司
  • 做房产的网站排名seo首页关键词优化
  • 竹子建站下载友情链接论坛
  • 贴吧做网站网上商城推广13种方法
  • 网站制作网页制作百度快照推广一年要多少钱
  • 企业网站建设要多久正规接单赚佣金的app
  • 建站之星网站建设下载版cpv广告联盟
  • 为什么网站要域名南宁seo网络推广
  • 页面设计模板素材栾城seo整站排名
  • 如何更新网站缓存企业网站制作需要多少钱