当前位置: 首页 > 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.zhongyajixie.com/news/53739.html

相关文章:

  • 找别人做网站交货时应该注意什么十大网站平台
  • 武汉经济开发区汉南区教育云网站台州百度关键词排名
  • 网站logo织梦怎么做知乎关键词排名优化
  • 如何做漫画赚钱的网站搜索引擎营销有哪些
  • 跨境自建站模板千锋教育和黑马哪个好
  • 武汉网站建设组织站长工具在线平台
  • 台州市住房和城乡建设厅网站石家庄seo外包公司
  • 公司ppt模板家庭优化大师免费下载
  • 网站开发制作公司简介百度识图在线使用一下
  • 石家庄抖音代运营公司windows优化大师的优点
  • 济南网站地址网址收录大全
  • 诸暨网站制作网页广告调词平台
  • 广州做网站建设的公司哪家好网店代运营的套路
  • 淘宝联盟推广可以做网站吗深圳百度竞价推广
  • 无锡网站建设哪家做的比较好哪里有学市场营销培训班
  • 九龙坡建站公司百度网站优化方案
  • 我想看b站直播间游客怎么看南宁今日头条最新消息
  • 广州建网站哪家最好网站每天做100个外链
  • 网站建设只是上海网站排名seo公司
  • 建设网站公司需要准备哪些材料企业文化经典句子
  • 东莞网站建设服务公司建立一个网站的费用
  • 福州小学网站建设爱采购seo
  • wordpress没用手机优化大师官网
  • wordpress遇到的问题文军seo
  • 手机网站建设费用郑州网站
  • 合肥网站建设sina千锋教育北京校区
  • 临沂做网站多少钱十堰seo优化方法
  • word网站链接怎么做百度爱采购怎样入驻
  • 门户网站 建设佛山seo优化外包
  • 成都中小企业网站建设百度百科入口