第二节Lambda函数对象_第1页
第二节Lambda函数对象_第2页
第二节Lambda函数对象_第3页
第二节Lambda函数对象_第4页
第二节Lambda函数对象_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一节主要升级10、右值与move语义第二节Lambda函数对象第三节function包装器C++11标准,原名C++0x,是C++的正式标准(ISO/IEC14882:2011),它将取代第二版标准C++98以及C++03(两者差别极小)。C++11包含了机能的升级,STL的拓展,并且加入了大部分C++TR1程序库(除数学上的特殊函数)。C+是自年C++98以来第一次重大升级。根据计划,ISO将在年发布C++的后续版本。目前,各家编译器对标准的各有不同。图1C第一节升。这些升级大致可以分为:运行期强化、建构其强化、可用性强化,以及其他一些强化。C++新增类型longlong和unsignedlonglong,以支持64位整型;新增char16_t和char32_t,以支持16位和32位的字符表示。另外,例程345678

#include<string>usingnamespaceint{stringnormal_str="Firstline.\nSecondline.\nEndofstringraw_str=R"(Firstline.\nSecondline.\nEndofmessage.\n)";}例程intdoubleintdoubleintintint*p=newclassudC(intclassudC(inta,doubleintdouble}udCudCstructintdouble}udSmyUDs{53.2f};//传统C⑴auto与例程intplus(inta,intb)( doubleint((temte<typenameTa,typenamevoidsomeFun(Taa,Tb)}345678第18例程第1 第2 temte<typenameTa,typename autosomeFun(Taa,Tbb)-例程第12345第6 第7 89第10第11第12第16第17第18第19第20第21第22第23usingusingnamespace te<typenameautoiterMulti(Ta,Tb)->decltype(*a*decltype(*a**b)tmp=*a+return}intvector<int>cout<<iterMulti(myVec.begin(),(myVec.begin()+1))<<return}typedef torusing temte<typenameusing例程usingnamespaceusingnamespaceintmap<string,int>m{{"a",1},{"b",2},{"c",3}for(autop:cout<<p.first<<":"<<p.second<<}}5678例程structA()=structA()=default;virtual~A()=default;值操作符,要禁用,这两个特殊的成员函数=delete即可。例程usingnamespacestructusingnamespacestructNoCopy&operator=(constNoCopy&)=NoCopy(constNoCopy&)=intNoCopyb(a);}345678例程classM{//C++11classM{//C++11delegatingintx,charM(intv):x(v),y(0),p(newchar[1000]){}//#1M():M(0)cout<<"delegatingctor"<<}⑴unique_ptr是一种定义在<memory>中的智能指针(smartpointer)。它持有对对象的独有权即两个unique_ptr不能指向一个对象,不例程usingnamespaceusingnamespacevoidunique_ptr<int>pA(newcout<<*pA<<//unique_ptr<int>pB=unique_ptr<int>pC=//cout<<*pA<<cout*pCendl;//输出78第12第16第18intintreturn} 例程2345678

usingnamespacestd;voidTest(){shared_ptr<int>cout<<pA.use_count()<<endl;shared_ptr<int>pB(newint(100));cout<<pB.use_count()<<endl;pOuter=pB;cout<<pB.use_count()<<}intcoutpOuter.use_count()endl;cout<<*pOuter<<endl;//输出100return}⑶有时对象必须法,用来在不引起计数增加的情况下shared_ptr的基础对象。通常,当您在shared_ptr实例之间循环时,就会出现此情况。行循环。如果循环不可避免,甚至由于某种原因而更为可取,请使用weak_ptr为一个或多个所有者提供对其他shared_ptr 。使用weak_ptr,您可以创建连接到现有相关实例组的shared_ptr,但仅当基础内存资源有效时才行。weak_ptr本身并参与计数,因此,它无法计数转到为零。但是,您可以使用weak_ptr来尝试获取shared_ptr的新副本,通过使用该副本进行初始化。如果内存已被删除,则会bad_weak_ptr异常。如果内存仍有效,则新的共享指针会递增计数,并确保只要shared_ptr变量保持在范围内,内存就有效。#include#include 例程#include#include#include#includeusingnamespaceclass{intwstringexplicitController(inti):Num(i),{wcout<<L"CreatingController"<<Num<<}{wcout<<L"DestroyingController"<<Num<<}//Demonstrateshowtotestwhether//pointed-tomemorystillexistsorvoidCheckStatuses(){{{autop=wcout<<L"Statusof"<<p->Num<<"="<<p->Status<<}catch(bad_weak_ptr{wcout<<L"Nullobject"<<}}5678第40void{void{//Eachcontrollerdependsonallothersnotbeing//Giveeachcontrollerapointertoallthefor(unsignedinti=0;i<v.size();{for_each(v.begin(),v.end(),[v,i](shared_ptr<Controller>{if(p->Num!={wcout<<L"push_backtov["<<i<<"]:"<<p->Num<<}}{wcout<<L"use_count="<<p.use_count()<<}int{return}voidprint()noexcept10、右值与move语#include#include#include#include#includeusingnamespaceint{stringstr= vector<string>cout<<"Aftercopy,stris\""<<str<<cout<<"Aftermove,stris\""<<str<<cout<<"Thecontentsofthevectorare"<<v[0]<<""<<v[1]<<return}第 第行第第第第#includeusing#includeusingnamespacevoidstringSwap(string&a,stringstringtmp=a=b=}int{stringa=stringb=stringSwap(a,cout<<a<<endl<<return345678}class}class {CMyString(constchar*pszSrc={cout<<"CMyString(constchar*pszSrc=NULL)"<<if(pszSrc=={m_pData=new*m_pData=}{m_pData=newstrcpy(m_pData,}}CMyString(constCMyString{cout<<"CMyString(constCMyString&s)"<<m_pData=newstrcpy(m_pData,}CMyString(CMyString{cout<<"CMyString(CMyString&&s)"<<m_pData=s.m_pData=}{cout<<"~CMyString()"<<delete[]move的实现与右值密切相关,如例程所示第第第第第第行8第38m_pData=m_pData=}CMyString&operator=(constCMyString{cout<<"CMyString&operator=(constCMyString&s)"<<if(this!={delete[]m_pData=newstrcpy(m_pData,}return}CMyString&operator=(CMyString{cout<<"CMyString&operator=(CMyString&&s)"<<if(this!={delete[]m_pData=s.m_pData=}return}char第二节Lambda义函数对象类(class)并构造函数对象(FunctionObject)。例程16是Lambda的是一个应用示例,注意比对第26行、第27行,会发现createNum和[]{returnrand()%10;}地位相同,其中createNum是函数指针,指向已定义的createNum()函数,[]{returnrand()10Lambda函数。如果进一步观察二者的代码更会发例程 usingnamespaceintreturnrand()%}if(N==0||N==1)returnfor(intiLoop=2;iLoop<N;++iLoop)if(N%iLoop==0)returnreturn}temte<typenamegreaterThan(Tx)booloperator()(Tx){returnx>num;Tintvector<int>),generate(myVec.beginmyVec.end(returnrand10;Lambdacopy(myVec.begin(),myVec.end(), tor<int>(cout,""));cout<<intcountA=count_if(myVec.begin(),myVec.end(),[](intx){returnx%2==0;intcountBcount_if(myVec.begin(),myVec.end(),bind2nd(less<int>5));//STLintcountCcount_if(myVec.begin(myVec.endisPrime);=(),return}第4第5 678usingnamespaceusingnamespaceclassintudFun(intX){returnX;intoperator()(){returnrand()%100;intautowhatIsreturnrand100Lambdacout<<typeid(whatIs).name()<<//输出:classautomyUDc=couttypeid(myUDc).name()endl;//输出:classcoutsizeof(whatIsendl;coutsizeof(udC)endlcoutudC().operator()endl;coutudC().udFun(10)endlreturn}第第第第第第第行 [Capture_List](Parameter_List)mutablethrow()->r}例程usingnamespaceboolusingnamespaceboolisPrime(intif(N==0||N==1)returnintLastNum=N/for(inti=2;i<LastNum;++i)if(N%i==0)returnreturn}intvector<int>for(inti=0;i<100;intnumEven=0,numOdd=0,numPrime=[&numEven,&numOdd,&numPrime](intnumEven+=(X%2==numOdd+=(X%2==numPrime+=(isPrime(X)==true?1:}coutnumEvennumOddnumPrimereturn}Capture_List可以称之为捕获列表,用于捕获Lambda函数对象外的参数。在例程18中,代码[&numEven,&numOdd,&numPrime](int形式的用法,如例程所示。usingusingnamespaceintintnumA=100,numB=200,numC=300,numSum=autolambdaAnumA](intx){coutnumA;coutlambdaB(10)endlautolambdaC=[=,&numSum]{numSum=numA+numB+coutnumSumendl;autolambdaD=[=]{cout<<(numA+numB+numC)<<endl;第行 第11autolambdaEautolambdaE=[&]{cout<<(numA++)<<endl;coutnumAendl;//输出autolambdaF=[&,numSum](intN)mutablenumC+=N;numSum+=numC;cout<<numC<<""<<numSum<<coutnumCnumSum<<endl;//输出:410return}内,此时修改该变量的值,则将改变函数对象体外的变量值,如第17-19行所示,代码[&]{cout<<(numA++)<<endl;}中的&变量有变量以值拷贝的形式传递到Lambda函数对象内,如第14行所示。第10行代码[=,&numSum]{numSum=numA+numB+numC;}表示除码[&,numSum](intN)则表示除numSum变量外其他都已方式传递,而numSum则以只拷贝的形式传递。码[this](intN)中的this传递到Lambda内,因此,可以通过this->num类的数据成员或函数成员。例程usingnamespaceusingnamespaceclassudC(intN)voidprintVector(constvector<int>[this](intcout<<N+this->num<<}}int345678第17intvector<int>intvector<int>udCreturn}例程#includeusingnamespace#includeusingnamespaceint{intm=[](intreturn[](intM){returncoutmendl;//输出return}45678第三节function例程#include#include#include#includeusingnamespaceint{autog=[](intx)->return[=](inty){returnx+y;autoh=[](constfunction<int(int)>&f,intreturnf(z)+cout<<g(7)(8)<<autoa=h(g(7),cout<<a<<345678第12第13return}return}第四节新增库文件12345通常为longlong类型的别名。由于ratio是编译时特性,因此其使用显得不同寻常,对象的定义与普通对象不同,且不能使用ratio对象的方法,通常使用typedef。有关ratio库的应用示例如例程23所示,第6行是ratio的定义示例,第9行、第10行分别为分子和分母(注意例程usingnamespaceusingnamespaceint>intmax_tUpNummyRatio::num;//intmax_t是longlong的别名,注意不是intmax_tDownNummyRatio::den;//intmax_t是longlongcout<<myRatio::num<<"/"<<typedefratio<4,6>coutmyND::nummyND::denendl;//输出:2/3constintmax_tnumU=constintmax_tnumD=typedefratio<numU,numD>typedefratio_add<myRatio,myNumUD>::typecoutResult::numResult::denendl;//输出345678第19第23typedefratio_less<myRatio,typedefratio_less<myRatio,myNumUD>coutboolalphaboolCheck::valueendl;myRatiomyNumUDcout<<tmp1+tmp2<<intmax_tintmax_ttypedefratio<U,D> cout<<giga::num<<"/"<<giga::den<<return}typedef typedef 0000,1>typedef 0,1>typedefratio<1000000000000000,1>typedefratio<1000000000000,1>typedef ,1>typedef ,1>兆typedefratio<1000,1>千typedefratio<100,1>百typedefratio<10,1>十typedefratio<1,10>typedefratio<1,100>typedefratio<1,1000>typedef >typedef >typedefratio<1,100000000000>typedefratio<1,100000000000000>typedef >typedef 000>typedef time_point类表示时间中的一个点,为相对于(epoch)的duration,相当于相对于某个基点的偏移量,一般采用1970年1月1例程usingnamespacesystem_clock::time_pointtoday1=system_clock::durationdtn1system_clock::time_pointtoday1=system_clock::durationdtn1=for(autoi=0;i ;system_clock::time_pointtoday2=cout<<(today2-today1).count()<<coutstd::chrono::duration_cast<std::chrono::nanoseconds(today2today1).count()coutstd::chrono::duration_cast<std::chrono::microseconds>(today2today1).countcoutstd::chrono::duration_cast<std::chrono::milliseconds>(today2today1).countreturn}第第第第\^$*+??字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z\ \<匹配词(word)的开始(\<)和结束(\>)。例如正则表达式\<the\>能够匹配字符串"forthewise"中的"the",但是不\(式中最多可以保存9个),它们可以用\1到\9的符号来。|将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her)itbelongstohim"和"itbelongstoher",但是不能匹配"itbelongstothem."。注意:这个元字符不是所有的软件都支持的。+匹配1或多个正好在它之前的那个字符。例如正则表达式9匹配 ?{i}个数字字符的串,例如A123、A348等,但是不匹配A1234。而正则表达式[0-9]{4,6}4个、5个或者6个数2345678第第第第第234567例程#include#include#includeusingnamespaceintconstregex//thesourcestd::stringweekend="Saturdayandstd::smatchboolmatch=regex_search(weekend,result,iffor(size_ti=1;i<result.size();cout<<result[i]<<}}return}例程#include#include#includeusingnamespaceint//regularconststd::regex//thesourcestd::stringweekend="SaturdayandSunday,butsomeFridaysconstfor tori(weekend

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论