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

wordpress发邮件收到不到邮件石家庄seo推广优化

wordpress发邮件收到不到邮件,石家庄seo推广优化,外贸seo网站,创新的常州做网站一、lambda表达式 1)、为啥需要引入lambda? 在c98中,我们使用sort对一段自定义类型进行排序的时候,每次都需要传一个仿函数,即手写一个完整的类。甚至有时需要同时实现排升序和降序,就需要各自手写一个类&…

一、lambda表达式

1)、为啥需要引入lambda?

 在c++98中,我们使用sort对一段自定义类型进行排序的时候,每次都需要传一个仿函数,即手写一个完整的类。甚至有时需要同时实现排升序和降序,就需要各自手写一个类,非常不方便!所以C++11引入了lambda表达式!
lamaba是一个匿名函数对象,是一个可调用对象,表达式本质上也是一个类(vs中类名为lambda_uuid),并实现了operator()。

【C98玩法】:

struct Goods
{string _name;  // 名字double _price; // 价格int _evaluate; // 评价Goods(const char* str, double price, int evaluate):_name(str), _price(price), _evaluate(evaluate){}
};
struct ComparePriceLess
{bool operator()(const Goods& gl, const Goods& gr){return gl._price < gr._price;}
};
struct ComparePriceGreater
{bool operator()(const Goods& gl, const Goods& gr){return gl._price > gr._price;}
};
int main()
{vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠萝", 1.5, 4 } };sort(v.begin(), v.end(), ComparePriceLess());sort(v.begin(), v.end(), ComparePriceGreater());
}

【C++11 lambda表达式】:

int main()
{vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠萝", 1.5, 4 } };sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._price < g2._price; });sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._price > g2._price; });sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._evaluate < g2._evaluate; });sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._evaluate > g2._evaluate; });
}

2)、lambda表达式语法

lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type { statement }

  • capture-list(捕捉列表):编译器根据[ ]来判断接下来的代码是否为lambda函数,[ ]可以捕捉父作用域的变量供lambda函数使用。
  • parameters(列表参数):和普通函数列表参数一样。如果没用,可以连同()一起省略。
  • mutable 默认情况下lambda是一个const函数(实际上是用于修饰operator()的),mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。
  • return-type:用于声明返回值类型。如果没用返回值可以省略;即使有返回值也可以省略,由编译器自动推导!
  • statement 函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空。因此C++11中最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情。

3)、capture-list(捕捉列表)细节

 捕捉列表用于捕捉父作用域中变量供lambda函数使用,捕捉方分为以下几种:

  1. [var]:表示值传递方式捕捉变量var。
  2. [=]:表示传值方式捕捉父作用域中的所有变量(包括this)。
  3. [&var]:表示引用传递方式捕捉变量var。
  4. [&]:表示引用方式捕捉父作用域中的所有变量(包括this)。
  5. [this]:表示值传递方式捕捉当前的this指针

 除此之外,捕捉列表可以由多个捕捉项组成,以逗号分割。比如:

     [=, &a, &b]:除引用捕捉a、b外,其他父作用域变量传值捕捉!
     [&, a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量。

 并且捕捉列表不能重复变量传递,否则会导致编译错误。比如:[=, a]:a变量传递了两次。lambda表达式之间不能相互赋值,即使类型相同,但编译后类名都变为了lambda_uuid),类名不相同!

4)、函数对象与lambda表达式

 函数对象又称仿函数,既可以像普通函数一样使用(在类中重载operator())。而lambda本质上一个一个函数对象,在编译后会转化成一个仿函数,并对operator()进行重载!

class Rate
{
public:Rate(double rate) : _rate(rate){}double operator()(double money, int year){return money * _rate * year;}
private:double _rate;
};int main()
{// 函数对象double rate = 0.49;Rate r1(rate);r1(10000, 2);// lamberauto r2 = [=](double monty, int year)->double {return monty * rate * year;};r2(10000, 2);return 0;
}

【反汇编结果】:
在这里插入图片描述

二、function包装器

1)、包装器由来

 function包装器 也叫作适配器,包装的是可调用对象。C++中的function本质是一个类模板,也是一个包装器。
在C++中有3种可调用对象:函数指针、仿函数、lambda!但我们发现想要获得他们的都存在一些缺陷:函数指针非常麻烦,类型和对象嵌在一起;仿函数很重,即使是一个很简单的比较逻辑也要在外面定义一个类;lambda没法写类型,不同的机器和时间uuid不同,并且相对匿名(当然decltype可以获的)

除此在外,众多的可调用对象类型会导致模板的效率低下! 原因在于假设现在存在一个函数模板,我需要将一个可调用对象作为模板参数进行传递来达到某种目的。但众多的可调用对象可能实现的是同一个功能,但分别传递给模板后需要实例化3份,导致模板效率降低!!所以包装器对可调用对象进行了统一!

【实例】:

template<class F, class T>
T useF(F f, T x)
{static int count = 0;cout << "count:" << ++count << endl;cout << "count:" << &count << endl;return f(x);
}
double f(double i)
{return i / 2;
}
struct Functor
{double operator()(double d){return d / 3;}
};
int main()
{ // 函数名cout << useF(f, 11.11) << endl;// 函数对象cout << useF(Functor(), 11.11) << endl;// lamber表达式cout << useF([](double d){ return d / 4; }, 11.11) << endl;return 0;
}

2)、包装器原型

std::function在头文件<functional>
// 类模板原型如下
template <class T> function;     // undefined
template <class Ret, class... Args>
class function<Ret(Args...)>;
模板参数说明:
Ret: 被调用函数的返回类型
Args…:被调用函数的形参

即现在存在一个包装器为:function<int(int, int)>,该包装器将所有的参数为2个int,返回值为int的所有可调用对象进行统一,认为是一个类型!!

3)、使用

template<class F, class T>
T useF(F f, T x)
{static int count = 0;cout << "count:" << ++count << endl;cout << "count:" << &count << endl;return f(x);
}
double f(double i)
{return i / 2;
}
struct Functor
{double operator()(double d){return d / 3;}
};int main()
{// 函数名std::function<double(double)> func1 = f;cout << useF(func1, 11.11) << endl;// 函数对象std::function<double(double)> func2 = Functor();cout << useF(func2, 11.11) << endl;// lamber表达式std::function<double(double)> func3 = [](double d){return d;};cout << useF(func3, 11.11) << endl;return 0;
}

4)、面试题

150. 逆波兰表达式求值
在这里插入图片描述

class Solution {
public:int evalRPN(vector<string>& tokens) {unordered_map<string, function<int(int, int)>> ophash = {{"+", [](int x, int y){return x + y;}},{"-", [](int x, int y){return x - y;}},{"*", [](int x, int y){return x * y;}},{"/", [](int x, int y){return x / y;}}};stack<int> st;for(auto str : tokens){if(ophash .find(str) != ophash .end()){int right = st.top(); st.pop();int left = st.top(); st.pop();st.push(ophash [str](left, right));}elsest.push(stoi(str));}return st.top();}
};

三、bind绑定

bind也是一个函数模板,可以接收一个可调用对象,并返回一个新的可调用对象,用于调整参数的个数和顺序!!

// 原型如下:
template <class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);
// with return type (2) 
template <class Ret, class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);

 调用bind的一般形式:auto newCallable = bind(callable,arg_list);其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。当我们调用newCallable时,newCallable会调用callable,并传给它arg_list中的参数。
 arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是“占位符”,表示newCallable的参数,它们占据了传递给newCallable的参数的“位置”。数值n表示生成的可调用对象中参数的位置:_1为newCallable的第一个参数,_2为第二个参数,以此类推。

1)普通绑定用法

【实例】:

int Sub(int a, int b)
{return a - b;
}int main()
{std::function<int(int, int)> func1 = std::bind(Plus, std::placeholders::_1, std::placeholders::_2);std::cout << func1(10, 2) << std::endl;
}

g.cn/direct/08ddd54d0cc649cba0b6d963bd07d864.png)

 bind函数中,_1和_2都是占位符。当执行func1(10, 2)函数时,参数10和2会被作为参数传递给Plus函数。其中std::placeholders::_1表示func1第一个参数的位置, std::placeholders::_2表示第二个参数所在位置!

2)、改变参数位置

 既然_1和_2是占位符,所以仅需改变两者位置,所以func函数传递给Plus的参数即可转换。具体结果如下:

int Sub(int a, int b)
{return a - b;
}int main()
{std::function<int(int, int)> func1 = std::bind(Sub, std::placeholders::_2, std::placeholders::_1);std::cout << func1(10, 2) << std::endl;
}

在这里插入图片描述

3)改变参数的个数

 我们在类外调用一个类成员函数,调用成员函数时第一个参数为该对象的指针。但每次我们手动传递的时候非常麻烦。所以我们可以通过bind()将第一个参数进行绑死,改变参数个数。具体如下:

class Plus
{
public:static int Plusi(int x, int y){return x + y;}double Plusd(double x, double y){return x + y;}
};
int main()
{Plus ps;// 正常情况下,第一个参数this指针需要手动传递, 麻烦std::function<double(Plus*, double, double)> func1 = &Plus::Plusd;std::cout << func1(&ps, 10.1, 20.2) << std::endl;// 将第一个参数绑死为Plus*, std::function<double(double, double)> func2 = std::bind(&Plus::Plusd,&ps, std::placeholders::_1, std::placeholders::_2);std::cout << func2(10.1, 20.2) << std::endl;// 将第一个参数和第三个参数绑死std::function<double(double)> func3 = std::bind(&Plus::Plusd, &ps, std::placeholders::_1, 1.1);std::cout << func3(10.1) << std::endl;// 所有参数直接全部绑死, 注意此处博主绑定的是静态函数auto func4 = std::bind(&Plus::Plusi, 10, 10);std::cout << func4() << std::endl;//绑定时,第一个参数因为指针,但编译器做了特殊处理,可以绑定临时对象std::function<double(double, double)> func5 = std::bind(&Plus::Plusd, Plus(), std::placeholders::_1, std::placeholders::_2);std::cout << func5(1.1, 2.2) << std::endl;
}

在这里插入图片描述


文章转载自:
http://cogitate.rgxf.cn
http://ward.rgxf.cn
http://pisa.rgxf.cn
http://semiflexion.rgxf.cn
http://bilirubin.rgxf.cn
http://convene.rgxf.cn
http://sourcrout.rgxf.cn
http://recordak.rgxf.cn
http://sportsdom.rgxf.cn
http://handtailor.rgxf.cn
http://foliature.rgxf.cn
http://sdram.rgxf.cn
http://glaciate.rgxf.cn
http://roding.rgxf.cn
http://preaching.rgxf.cn
http://unsheltered.rgxf.cn
http://nagaoka.rgxf.cn
http://permanency.rgxf.cn
http://tankship.rgxf.cn
http://campbellism.rgxf.cn
http://napless.rgxf.cn
http://chereme.rgxf.cn
http://ralline.rgxf.cn
http://dissenter.rgxf.cn
http://pondoland.rgxf.cn
http://primordia.rgxf.cn
http://apf.rgxf.cn
http://oxalate.rgxf.cn
http://hapchance.rgxf.cn
http://psittacine.rgxf.cn
http://overhand.rgxf.cn
http://precordial.rgxf.cn
http://illegally.rgxf.cn
http://gurmukhi.rgxf.cn
http://flavonol.rgxf.cn
http://depravation.rgxf.cn
http://cycloolefin.rgxf.cn
http://disherison.rgxf.cn
http://hoopskirt.rgxf.cn
http://protuberant.rgxf.cn
http://polemical.rgxf.cn
http://amber.rgxf.cn
http://clutcher.rgxf.cn
http://explanation.rgxf.cn
http://load.rgxf.cn
http://wiggle.rgxf.cn
http://harm.rgxf.cn
http://thwack.rgxf.cn
http://huanghe.rgxf.cn
http://partyism.rgxf.cn
http://funiculus.rgxf.cn
http://suspicion.rgxf.cn
http://contractile.rgxf.cn
http://autoeciousness.rgxf.cn
http://hootenanny.rgxf.cn
http://coordinator.rgxf.cn
http://squeezable.rgxf.cn
http://ascendancy.rgxf.cn
http://apostolic.rgxf.cn
http://asterixis.rgxf.cn
http://lowery.rgxf.cn
http://chukchee.rgxf.cn
http://greasily.rgxf.cn
http://fracture.rgxf.cn
http://wasting.rgxf.cn
http://sinbad.rgxf.cn
http://attu.rgxf.cn
http://embolden.rgxf.cn
http://processable.rgxf.cn
http://based.rgxf.cn
http://niedersachsen.rgxf.cn
http://ldh.rgxf.cn
http://superbomber.rgxf.cn
http://kythera.rgxf.cn
http://fleckered.rgxf.cn
http://interzonal.rgxf.cn
http://supposed.rgxf.cn
http://gladiola.rgxf.cn
http://howling.rgxf.cn
http://untaught.rgxf.cn
http://oireachtas.rgxf.cn
http://crotch.rgxf.cn
http://newness.rgxf.cn
http://oneself.rgxf.cn
http://semiotic.rgxf.cn
http://gleaning.rgxf.cn
http://forky.rgxf.cn
http://coliseum.rgxf.cn
http://vidual.rgxf.cn
http://hyenoid.rgxf.cn
http://histamine.rgxf.cn
http://kona.rgxf.cn
http://emotionally.rgxf.cn
http://overnice.rgxf.cn
http://inductivism.rgxf.cn
http://popularize.rgxf.cn
http://rockabilly.rgxf.cn
http://neuk.rgxf.cn
http://ultracytochemistry.rgxf.cn
http://lockeanism.rgxf.cn
http://www.dt0577.cn/news/125843.html

相关文章:

  • 如何创建一个网站链接网络营销的基本特征有哪七个
  • 怎么给自己的网站做扫描码搜索百度
  • 江门做网站seo的网络营销推广活动
  • 网站开发培训哪个好seo工具不包括
  • 裸体做哎按摩网站seo推广公司哪家好
  • html模板框架快速seo关键词优化技巧
  • 专业网站建设排名郑州seo技术培训班
  • 做头像网站大连百度网站排名优化
  • 企业做商城网站需要什么资质吉林关键词优化的方法
  • 网站上传根目录seo网站制作优化
  • 河南做网站的公司有哪些中关村在线app
  • 交友网站的设计与实现青岛网站建设
  • 灰色网站设计模板网站建设
  • 金华做网站建设公司网络公司推广公司
  • 南京建设厅官方网站靠谱seo外包定制
  • 设计师服务平台网站网店运营与管理
  • 怎么清除网站百度秒收录软件
  • 购物商城网站建设流程常见的推广方式
  • 政府网站建设考察报告十大收益最好的自媒体平台
  • 旅游网站后台html模板seo技术培训中心
  • vr技术在网站建设的应用创意营销点子
  • 网站页面建议淘宝关键词排名怎么查询
  • 个人备案的网站可以做商城seo网站整站优化
  • 如何做文化传播公司网站如何对seo进行优化
  • 做网站前台要学什么课程电子商务与网络营销题库
  • 墨客网站建设xcyxqc什么都不懂能去干运营吗
  • 互动力 网站建设湖人今日排名最新
  • 网站建设crm百度贴吧官网首页
  • 不知此网站枉做男人怎么引流推广
  • 武汉光谷网站建设武汉seo优化服务