版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Boost专题讲传智播客·大1、Boost专题讲 简 与安 编 配 测 2、Boost常用组 Boost智能指针的分 shared_ptr类shared_ptr使用Boost::weak_ptr的介 shared_ptr一些使用技巧 shared_ptr总结 其他的智能指 filesystem库编 路径 与文 4、boost容器 大小写转 字符串查找算 切 拼 创建线 互斥 条件变 线程局部仅运行一次的例 二、boost1、简介Boost库是为C++语言标准库提供扩展的一些C、、Boost库由Boost社区组织开发。提供免费的、可移植的程序库。、、库可以与C++标准库完美共同工作,并且为其提供扩展功能。从某种意义上来讲,Boost库成为具有实践意义的准标库。大部分等)需要库。里面有许多具有工业强度的库,如graph库。很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧法,不要贸然的花费Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值按照实现的功能,Boost可为大致归入以下二十多个分类,在下面的分类中,有些库同时2、类库字符串和文本处理Conversion库:对C++类型转换的增强,提供更强的类型安全转换、更高效的类型安全Format库:实现类似printf的格式化对象,可以把参数格式化到一个字符串,而且是完IOStream库:扩展C+LexicalCastRegex库:正则表达式,已经被TR1所接受。Spirit库:基于EBNF范式的LL解析器框架StringAlgoTokenizerWave库:使用spirit库开发的一个完全符合C/C++Xpressive容器Array库:对C语言风格的数组进行包装Bimap库:双向结构CircularBufferDisjointSets库:实现不相交集的库DynamicBitsetGIL库:通用图像库Graph库:处理图结构的库ICL库:区间容器库,处理区间集合和Intrusive库:侵入式容器和算法Multi-Array库:容Multi-Index库:实现具有多个STL兼容索引的容器PointerContainer库:容纳指针的容器PropertyMap库:提供键/值的属性概念定PropertyTreeUnordered库:散列容器,相当于Variant库:简单地说,就是持有stringvector等复杂类型的联合体迭代器GIL库:通用图像库Graph库:处理图结构的库IteratorsTokenizerForeach库:容器遍历算法GIL库:通用图像库Graph库:处理图结构的库Min-MaxRangeStringAlgoUtility库:小工具的集合函数对象和高阶编程Bind库:绑定器的泛化,已被收入Function库:实现一个通用的回调机制,已被收入Functional库:适配器的增强版本Functional/FactoryFunctional/ForwardFunctional/Hash库:实现了TR1中的散列函数Lambda库:Lambda表达式,即未命名函数MemberFunction库:是STL中mem_fun和mem_fun_ref的扩展Ref库:包装了对一个对象的,已被收入ResultOf库:用于确定一个调用表达式的返回类型,已被收入SignalsSignals2库:基于Signal的另一种实现Utility库:小工具的集合Phoenix库:实现在C泛型编程CallTraitsConceptCheckEnableIfGIL库:通用图像库InPlaceFactoryTypedInPlaceFactory库:工厂模式的一种实现PropertyMap库:提供键值的属性概念定StaticAssert库:把断言的时刻由运行期提前到编译期,让编译器检查可能发生的TypeTraitsTTI模板元编Fusion库:提供基于tuple的编译期容器和算法MPL库:模板元编程框架Proto库:构建领域语StaticAssert库:把断言的时刻由运行期提前到编译期,让编译器检查可能发生的错TypeTraits预处理元编程Preprocessors并发编程Asio库:基于操作系统提供的异步机制,采用前摄设计模式实现了可移植的异步IO操MPIThread库:为C++增加线程处理能力,支持Windows和POSIX线程coroutines,用户级协作线程或者类似于C#语言中yieldAtomicC++11样式的atomic<>,提供原子数据类型的支持和对这些原子类型Coroutine务的,而多线程是基于抢先式多任务的。Lockfree数学和数字AccumulatorsIntegerIntervalMathMathCommonFactorMathOctonion库:用于支持八元数MathQuaternion库:用于支持四元数Math/SpecialFunctionsMath/StatisticalDistributionsMulti-Array库:容NumericConversionOperators库:允许用户在自己的类里仅定义少量的操作符,就可方便地自动生成其他操RandomRational库:实现了没有精度损失的有理数uBLASGeometryRatio库:根据C++0x标准N2661号建议,实现编译期的分数操作。r)Multiprecision库:提供比C++内置的整数、分数和浮点数精度更高的多精度数值运算功s)Odeint排错和测试ConceptCheck库:用来检查是否符合某个概念StaticAssert库:把断言的时刻由运行期提前到编译期,让编译器检查可能发生的Test数据结构AnyBimap库:双向结构CompressedPair库:优化的对pair对象的Fusion库:提供基于tuple的编译期容器和算法ICL库:区间容器库,处理区间集合和Multi-IndexPointerContainer库:容纳指针的容器PropertyTreeTuple库:元组,已被TR1接受Uuid库:用于表示和生成Variant库:有类别的泛型联合类Heap库:对std::priority_queue扩展,实现优先级队列。TypeErasure:实现运行时的多态。图像处理GIL库:通用图像库输入输出Assign库:用简洁的语法实现对STL容器赋值或者初始化Format库:实现类似printf的格式化对象,可以把参数格式化到一个字符串,而且是IOStateSaversIOStreams库:扩展C+ProgramOptions库:提供强大令行参数处理功Serialization库:实现CPython库:用于实现Python和C+内存管理Pool库:基于简单分隔思想实现了一个快速、紧凑的内存池SmartPtr库:智能指针Utility库:小工具的集合解析Spirit库:基于EBNF范式的LL编程接口Function库:实现一个通用的回调机制,已被收入Parameter综合类CompressedPair库:优化的对pair对象的CRC库:实现了循环冗余功DateTimeFilesystem库:可移植的文件系统操作库,可以跨平台操 、文件,已被TR2接FlyweightLexicalCastMetaStateMachine库:用于表示UML2有限状态机的库NumericConversionOptionalPolygonProgramOptions库:提供强大令行参数处理功ScopeExit库:使用preprocessor库的预处理技术实现在退出作用域时资源自动StatechartSwapSystem库:使用轻量级的对象封装操作系统底层的错误代码和错误信息,已被TR2接TimerTribool库:三态布尔逻辑值,在true和false之外引入indeterminate不确定状态Typeof库模拟C++0x新增加的typeof和auto关键字以减轻变量类型的工作,UnitsUtility库:小工具集合ValueInitialized库:用于保证变量在时被正确初始Chrono库:实现了C0x标准中N2661Log库:实现日志功能。Predef库:提供一批兼容探测其他宏的预定义宏编译器问题的变通方案CompatibilityConfig库:将程序的编译配置分解为三个部分:平台、编译器和标准库,帮助库开发者3、与安boost相关的库的安装包::其中1.57.0版本的地址是:4、编译将的Boost源代码包解压缩,进入 ,双击bootstrap.bat运行批处理程序。生成b2.exe和bjam.exe这两个应用程序,bjam.exe是早期编译boost库的应用程序,我们使用b2.exe来进行编译。使用下面令完全编译boost库:b2--toolset=msvcstage5、配置打开VC,新建一个Project,在Project名称上点右键,选择【属性,打开属性页。依次打开【配置属性】->【VC++ 】配置项,将boost源码6、测试将下列代码敲入新建的project中,保存运行#include<vector>#include<iostream>#include<boost/foreach.hpp>#include<boost/assign.hpp>#include<boost/timer.hpp>usingnamespacestd;usingnamespaceboost;intmain(){timervector<int>v=(assign::list_of(1),2,3,4,5);BOOST_FOREACH(intx,v){cout<<x<<}cout<<cout<<apsed()<<"s"<<endl;cout<<"oworld!"<<endl;return0;}三、Boost常用组件四、智能指针1、内存泄漏(memoryleak)2、野指针(wildpointer)3、越界(accessboost通过boost智能指针库,能够高效的进行内存管理,解决上述问题,同时彻底让你忘记栈(stack),堆(heapboostc++提供的内存管理解决方案可能比java和c#等其他语言更好,更高效.智能指针与RAII机制为了管理内存等资源,智能指针采用RAII机制(ResourceAcquisitionIs12、所有的操作都放在对象的析构函数里3这种用构造函数申请资源用析构函数资源的做法或者说技术通常被称为“资源获而易见的:对象创建后,用户能开始正确使用对象,不用担心对象的有效性或者是否Boost智能指针的分类:boost提供下列几种智能指针:1、boost::shared_ptr是boost.smart_ptr中最有价值,最重要,也是最有用的类,boost库的其他许多类库都使用了shared_ptr,被收入了c++11标准。2、boost::shared_ptr实现了计数它包装了new操作符在堆上分配的动态对象,但它实现了计数,可以的拷和赋值在任意地方共享它当计数为0时它会自动删除被包装的动态分配的对象3、boost::shared_ptr不需要手动的调用类似release方法:它不像侵入式实现的智能指针一样需要手动的调用类似release方法,全部用由shared_ptr的计数器自动增减,这一点是非常有用的(COM的IUnknow接口以及boost::intrusive_ptr<T>都是基于侵入式设计的智能指针,需要手动调用类似release方法)4、boost::shared_ptr支持所转移:并且可以安全的在stl标准容器中,是在stl容器指针的标准解法。例std::vector<int*>IntVec,使用shared_ptr方式为std::vector<boost::shared_ptr<int>>shared_ptr类1Template<classT>Class{shared_ptr();//创建一个持有空指针的shared_ptr,use_count()0&&get//获得一个指向类型T的指针p的管理权,use_count1&&get()p,Y类型必须能够转换为T类型template<classY>explicitshared_ptr(Y*//作用同上,增加了一个构造参数D,是一个仿函数对象,代表删除器,该构造函数template<classY,classD>shared_ptr(Y*p,D//调用拷贝构造函数或赋值操作后,计数加1&&get()==r.get()&&use_count()==shared_ptr(shared_ptrconst&template<classY>shared_ptr(shared_ptr<Y>const&r);shared_ptr&operator=(shared_ptrconst&r);template<classY>shared_ptr&operator=(shared_ptr<Y>const&//计数会减1,如果计数器为0,get()!=NULL,有删除器的话会调用删除器,否则调用delete操作符}、public成员方法和操作符Template<classT>class{T*get()constT&operator*constT*operator->()cosnt;//返回原始指针longuse_count()const;//返回计boolunique()const;//返回use_count()1,operatorbool()const;//bool值,可以用于条件判断,例如voidswap(shared_ptr&bvoidreset();template<classY>voidreset(Y*p);template<classY,classD>voidreset(Y*p);}shared_ptr的一个例子1、#include2、创建一个shared_ptr要用到的简单类FooclassFoo{std::stringFoo(conststd::string&strName):~Foo(){std::cout<<“DestructingFoowithname=“<<m_strName<<3、实现voidTest_Boost_Shared_Ptr()typedefboost::share_ptr<FooFooPtr;voidTest_Boost_Shared_Ptr(){//ptr1获得Foo1指针的所FooPtrptr1(newFoo(“Foo1”));//计数为1assert(ptr1.use_count()==1);//ptr2指向FooPtrptr2=ptr1;//调用shared_ptr的赋值操作符,计数加1assert(ptr1.use_count()==ptr2.use_count());//两者计数相同assert(ptr1==ptr2);//shared_ptr重载==操作符,等同于ptr1.get()==ptr2.get()。assert(ptr1.use_count(2);//现在ptr1和ptr2都指向了Foo1,因此计数器都为2//ptr3获得Foo1指针的所FooPtrptr3=ptr2;//计数加assert(ptr1.use_count()==ptr2.use_count()&&ptr1.use_count()==ptr3.use_count());assert(ptr1.use_count()==3&&ptr2.use_count()==3&&ptr3.use_count()==3);assert(ptr1==ptr2&&ptr1==ptr3);//现在重置ptr3,测试reset()函数assert(ptr3.use_count()==0&&ptr3.get()==std::cout<<"ptr3计数为0,get()指针指向NULL,但是不会调用析构函数,因为和ptr2都指向了原生指针"<<assert(ptr1.use_count()==ptr2.use_count()&&ptr1.use_count()==2);assert(ptr1==ptr2&&ptr1!=ptr3);//前面ptr1和ptr2都指向了同一个对象,他们的计数都为2,现在创建一个ptr4,让其指向ptr1。FooPtrptr4=ptr1;//计数加1assert(ptr1ptr2&&ptr4ptr1);assert(ptr4.use_count==3&&ptr1.use_count==3&&ptr2.use_count()==//现在转移ptr2的所到另外一个新分配的名为Foo2的Foo指针上//在ptr2转移所后,ptr2的计数器应该是1&&ptr1和ptr4的计数器为&&ptr1!=ptr2.reset(newFoo(“Foo2”assert(ptr2.use_count()==1&&ptr1.use_count()==2&&ptr4.use_count()==assert(ptr1!=ptr2&&ptr1==//前面ptr3因为被reset()为0,并且get()=NULL了,再用ptr5来指向ptr3,此时ptr5的计数也应该//为0而不是加1,并且ptr5.get()返回值应该也为NULLFooPtrptr5=ptr3;//计数为0assert(ptr5.use_count()==0&&ptr5.get()==//首先会调用ptr2的析构函数,打印出DestructingaFoowithname= //然后会调用ptr1和ptr4析构函数进行计数递//最终会打印出DestructingaFoowithname= //这样就没有任何内存了}//结束test_boost_shared_ptr函数shared_ptr使用1、shared_ptr多次同一内存数据导致程序void{Foo*pFoo=newFoo("Foo1");boost::shared_ptr<Foo>ptr1(pFoo);boost::shared_ptr<Foo>}上述代码两次同一内存而破坏堆,导致程序奔溃。1、shared_ptr多次同一内存数据导致程序)直接使用boost::shared_ptr<int>ptr1(new使用内存分配限制其他shared_ptr多次指向同一内存数据。多次指向时使用shared_ptr的赋值操作符或拷贝构造函数,例如shared_ptr<int>ptr2=ptr1。上面的方式就是资源初始化既分配技术,直接在构造函数中分)使用boost的make_shared模板函数,例如shared_ptr<intptr1shared_Ptr<int>ptr2=2、shared_ptr循环导致内存,代码如下:classParent;classChild;class{~Parent(){std::cout\n2、shared_ptr循环导致内存,代码如下(续)class{~Child(){std::cout\nboost::shared_ptr<Parent>2、shared_ptr循环导致内存,代码如下(续)int{boost::shared_ptr<Parent>father(nerent());//father计数为1boost::shared_ptr<Child>son(newChild());//son计数为1//父子互相father->children=son;//son的计数为2son->parent=father;//father的计数为2return0;//退出作用域前,father和son的计数都减1,此时father和son的计数都是为1//因此各自指向的内存无法,导致内存}2、shared_ptr循环导致内存上述代码运行后不会调用father和son的析构函数因为循环导致father和的计数都为2,退出作域时候,计数减1,因此father和son在退出作用域时候计数都为1,无法调用析构函数,于是造成father和son所指向的内存得不到,导致内存2、shared_ptr循环导致内存的解决方案代码针对循环,使用boost:weak_ptr可以很方便的解决该问题。代码如下:classParent;classChild;class{~Parent(){std::cout\nboost::shared_ptr<Childchild_ptr第七节:shared_ptr使用2、shared_ptr循环导致内存的解决方案代码针对循环,使用boost:weak_ptr可以很方便的解决该问题。代码如下(续):classChild{~Child(){std::cout\n//boost::shared_ptr<Parent>Parent_ptr;改为如下代码:boost::weak_ptr<Parent>Parent_ptr;Boost::weak_ptr的介绍1、weak_ptr是用来解决循环和自对从前面的例子可以看出,计数是一种很便利的内存管理机制,但是有一个很的缺点那就是不能管理循环或自对(例如链表或树节点),为了解决这个限制,因此weak_ptr被引入到boost的智能指针库中。2、weak_ptr并不能单独存在它是与shared_ptr同时使用的,它更像是shared_ptr的助手而不是智能指针,因为它不针,不能操作资源,这正是它“弱”的原因。它最大的作用是协助shared_ptr工作,像旁观第八节:Boost::weak_ptr的总结3、weak_ptr获得资源的观察权weak_ptr可以从一个shared_ptr或另外一个weak_ptr构造,从而获得资源的观察权,但weak_ptr并没有共享资源,它的构造并不会引起计数的增加,同时它的析构也不引起计数的减少,它仅仅是观察者4、weak_ptrweak_ptr实现了拷贝构造函数和重载了赋值操作符,因此weak_ptr可以被用于标准容器库中的元素,例如:在一个树节点中子树节点std::vector<boost::weak_ptr<Node>>children;shared_ptr一些使用技巧:1、将shared_ptr用于标准容器库将标准容器库作为shared_ptr管理的对象例如boost::shared_ptr<std::vector<T>>,使容器可以被安全的共法与普shared_ptr没区别,不再将shared_ptr作为容器的元素例如std::vector<boost::shared_ptr<T>>,因为shared_ptr支持拷贝构造和赋值操作以及比被正确的删除,而保存shared_ptr作为标准容器库的元素,既保证与原始指针几乎一的功能,而且不用担心资源2、以函数方式封装现有的c函数例如crt的FILE操作函数,fopen/fclose/fread等函数,可以使用一些技巧,利用shared_ptr进行封装,从而使不需要调用fclose,实现FileClose函数(实际不需要实现该函数,这里实现是为了在资源时typedefboost::shared_ptr<FILE>voidFileClose(FILE*{std::cout<<“调用fclose函数FILE资源\n”}2、以函数方式封装现有的c函数2)实现FileOpen函数FilePtrFileOpen(constchar*path,constchar*{//FilePtrfptr(fopen(path,mode),fclose);//直接使用fclose作为shared_ptr的删除器FilePtrfptr(fopen(path,mode),FileClose);//使用的包装删除器,在return}3、用c++桥接设计模式来封装现有的c函数,隐藏实现细节在c++的.h文件中如下类:class{classimpl;//很重要一点,前向申明实现类,具体实现在.cpp文件中,隐藏实boost::shared_ptr<impl>pimpl;shared_ptr作为私有成员变量FileSharedPtr(charconst*name,charconst*mode);voidRead(void*data,size_tsize);3、用c++桥接设计模式来封装现有的c函数在c++的.cpp文件中实现如下类:class{impl(implconstimpl&operator=(implconst&){}FILE*f;impl(charconst*name,charconst*mode){f={intresult=printf("invokeFileSharedPtr::impl析构函数result}voidread(void*data,size_tsize){fread(data,1,size,f)3、用c++桥接设计模式来封装现有的c函数FileSharedPtr::FileSharedPtr(constchar*name,constchar*modepimpl(newvoidFileSharedPtr::Read(void*data,size_tsize){pimpl->read(data,size);}voidTest_CPP_File_Ptr(){FileSharedPtrptr(“memory.log”,“r”);//计数为1FileSharedPtrptr2=ptr;//计数为2chardata[100];}//析构ptr2计数为1,再析构ptr,计数为0,内存,无泄在c++的.h文件中如下接口:class{virtualvoidPrint()=protected://受保护的虚拟析构函数,导致本类必须被继承,也不能调用delete操作符。virtual{printf("invokeIPrintervirtual析构函数\}typedefboost::shared_ptr<IPrinter>PrinterPtrCreatePrinter();//工厂方法,创建IPrinter智能指针。在c++的.cpp文件中如下实现类(很重要一点,实现类都是在cpp文件中的,必须classPrinter:public{FILE*//使用createPrinter时候,调用实现类的构造函数,返回的是IPrinter的Printer(constchar*path,constchar*mode){f=fopen(path,mode);//实现类的析构是public,但是接口类的是protected,但是shared_ptr在析//且再次调用基类受保护的虚拟析构函数。通过这种机制可以完全封掉new和delete操作符,只能使用完全由shared_ptr来管理内存。//这样在整个程序中都没有原始指针的概念,从而不会忘记调用delte操作而导致内存。~Printer(){fclose(f);printf("invokePrinter析构函数result=%d\n",result);}voidPrint()chardata[100];fread(data,1,100,f);printf("%s\n",datarewind(f);PrinterPtrCreatePrinter()PrinterPtrptr(newPrinter("memory.log","r"returnptr};5、使用shared_ptr持有一个具有侵入式的计数的对象如Com对象或intrusive_ptr等需要手动增减计数的对象。假设要将shared_ptr用于一个COM对象。1)在头文件中引入<boost/mem_fn.hpp>头文件前定义宏:#defineBOOST_MEM_FN_ENABLE_STDCALL#include<boost/mem_fn.hpp>3)定义一个函数,例如shared_ptr<IWhatever> (IWhatever*p{//注意mem_fn仿函数的用法,它用于成员函数,&类名::成员函数名shared_ptr<IWhatever>pw(p,mem_fn(&IWhatever::Release));return}一旦使用shared_ptr享有com的接口指针所后,com的计数被所接管,因此所有计增减都是由shared_ptr来进行.6、使用shared_ptr持有一个win32例如win32使用HANDLE来代表内核对象,所有内核对象都使用CreateXXX创建一个句柄,而使用CloseHandle来释typedefvoid*HANDLE;//win32HANDLE的定义,在windows中可以看HANDLECreateMutex();BOOLCloseHandle(HANDLE);使用shared_ptr来管理上述类型的HANDLEtypedefshared_ptr<void>6、使用shared_ptr持有一个win32handleBOOLMyCloseHandleWrap(HANDLEh){std::cout<<“调用win32CloseHandleAPI\nreturn}handle{}7、使用shared_ptr持有一个静态分配的对象有时候需要使用shared_ptr来管理一个静态分配的对象或全局对象,例staticX由于静态或全局对象的析构是在程序结束时候自动进行的,不能够在中自动调用delete操作符,因此可以实现一个NULL析构器来实现该目的structnull_deleter/{voidoperator()(void*constconstshared_ptr<X>{shared_ptr<X>px(&xobj,null_deleter());returnpx;}8、使用shared_ptr<void>持有任意对象的所使用shared_ptr<void>来获得任何对象的所在该shared_ptr<void>离开作用域时候,会自动调用该shared_ptr所享有的实际对这四个模板函数。9、使用shared_ptr<void>持有任意对象的所void{boost::shared_ptr<voidptr(newstd::string(“voidPtrcreatefromstd::string”);//ptr计数为1boost::shared_ptr<voidptr2ptr;//ptr和ptr2计数都为2std::cout<<ptr2.use_count()<<std::endl;boost::shared_ptr<std::string>ptrStr=//ptr,ptr2和ptrStr的计数都为3std::coutptrStr.use_count()std::endl;std::cout<<ptrStr->c_str()<<//退出作用域前,会自动调用void指向的实际对象的析构函数,如果计数为0时,会销毁内存,无泄漏}shared_ptr总结:1、可以通过shared_ptr2、通过shared_ptr和weak_ptr获得整套内存管理的解决方案通过面象方式的编程模式(桥接模式,面向接口模式,受保护构造和析构,可以全部消灭掉原始指针,封闭掉new/delete操作符,使客户端调用完全不需要调用内存分配(new)和(delete)3、所付出的代价仅仅就是比原始指针多4个1、除了重载*和->操作符外,也没有定义其操作,基本操作类似shared_ptr.2、scoped_array和shared_array:用于数组,实际上像shared_ptr可以和stl容器搭配使用,数组的用途也不太大,可以自3、侵入式智能指针,由于在boost::smart_ptr库中,shared_ptr是首选,可以满足基本所有boost也不建议使用intrusive_ptr用于不需要使用删除器的情况下(仅仅使用new/delete进行内存分配和析构的类上面)。由于shared_ptr显式的消除了delete操作符的调用,因此使用该函数也可以显式的消除了new操作符的调用。2、调用该函数比直接创建shared_ptr对象的方式快且高效:因为它仅分配一次内存,消除了shared_ptr构造时的开销,建议在满足情况的基如果c++编译器支持c++11的可变参数模板特性,那么该工厂函数的参数数量没有限否则它只能接受最多10个参数被传递到T的构造函数参数中去,事实上貌似没有需要3、文件系统库,文件处理是语言例如s,perl,python所擅长的,但C++语言缺乏对操作系中文件的查询和操作能力,而现在boost::filesystem的出现解决了上述问题,filesystem库 关注boost::filesystem库的具体使用。1、C语言运行库<stdio.h>2、C++标准库<iostream>3、windows文件系统操作API4、Linux文件系统调用APIC++缺乏一个对操作系统中的文件进行查询和操作的能力,boost::filesystem库提供了一个移植的文件系统操作库,使用POSIX标准表示的文件系统路径,接口类似标准库的容器和代器,以跨平台操 ,文件filesystem库编译b2--with-system--with-filesystem--toolset=msvc-9.0variant=releaselink=staticstage,运行上述批处理程序后得到两个release版本的静态库,这两个静态库存放在stage/lib文件夹中, //(size==2&&[0]==/&&[1]==//net/abcsize2&&0&&[1]&&[2]windows绝对路径:c:/foopoxis绝对路径:相对路径:foo/abc 4、boost容器库全能容器stl的容器map,hashmap,list,vector,boost::bimap都是multi_index的特殊形式内存表示的具有基本功能的mysql数据库与操作相分离,使用multi_index_container作为数据容器,使用任何一个对mutil_index_container容器进行modify操作,其他关联index会进行同步更新多种类型的index,可以将每一个index(或视图)看成某一种stl容器usingnamespaceusingnamespacemutli_index类型ordered_unqiue和ordered_non_unqiueindextypenametypename>struct(ordered_unique|ordered_non_unique);typenameTagList,typenameKeyFromValue,typename>struct(ordered_unique|ordered_non_unique);hashed_unqiue和hashed_non_unqiueindextypenametypenameHash=boost::hash<KeyFromValue::result_type>,typename>struct(hashed_unique|hashed_non_unique);typenameTagList,typenameKeyFromValue,typenameHash=boost::hash<KeyFromValue::result_type>,typename>struct(hashed_unique|hashed_non_unique);hashed原理图//numberof1)size_typebucket_count()//Anupperboundonthenumberofbuckets2)size_typemax_bucket_count()const;//Thenumberofelementsinbucketsize_typebucket_size(size_typen)//Returnstheindexofthe//whichwouldcontainsize_typebuket(key_typeconst&k)//Returnbeginandenditeratorsforbucketn.5)const_local_iteratorbegin(size_typen)const;const_local_iteratorend(size_typen)const;non-key-based//相当于stl::list表示template<typenameTagList=tag<>>struct//相当于stl::vector表示template<typenameTagList=tag<>>structrandom_access;indexindexmodify操作insert成员函数std::pair<iterator,bool>insert(constvalue_type&x)//sequenced和random_access不具有iteratorinsert(iteratorposition,constvalue_type&x);template<typenameInputIterator>voidinsert(InputIterator,InputIteratorlast);erase成员函数iteratorerase(iteratorposition);iteratorerase(iterator,iteratorlast);size_typeerase(constkey_type&x)/ordered和hashed才具有的replace成员函数boolreplace(iteratorposition,constvalue_type&x);modify成员函数template<typenameboolmodify(iteratorposition,Modifiermod);template<typenameModifier,typenameRollback>boolmodify(iteratorposition,Modifiermod,Rollbackreplace在成功时才会修改multi_index_container中的元素以及相关其他index的索引modify不成功话会删除掉multi_index_container中的元素或相关其他index的索引.即使modify提供回滚的仿函数,可修改失败后针对修改容器操作ordered和hashed才拥有的成员函数template<typenameboolmodify_key(iteratorposition,Modifiermod);template<typenameModifier,typenameRollback>boolmodify_key(iteratorposition,Modifiermod,Rollbackback);swap成员函数voidswap(indexclassname&x);indexlookup操作根据key查找value(ordered和hashed才具有)template<typenameCompatibleKey>iteratorfind(constCompatibleKey&template<typename iteratorfind(constCompatibleKey&x,const pare&comp)const;根据key查找对应value的数量(ordered和hashed才具有)template<typenameCompatibleKey>size_typecount(constCompatibleKey&template<typename size_typecount(constCompatibleKey& pare&根据key查找所有value(ordered和hashed才具有,主要用于non_unique关联容器)template<typenameCompatibleKey>std::pair<iterator,iterator>equal_range(constCompatibleKey&x)const;template<typenameCompatibleKey,typename 返回的是std::pair<iterator,itertor>pair.起始迭代器while(pair.!=pair.second)pair.second结束迭代器++pair.;ordered才具有,主要用于non_unique关联容器三个成员函数(1)template<typenameiteratorlower_bound(constCompatibleKey&x)const;template<typenameCompatibleKey,typename iteratorlower_bound(constCompatibleKey& pare&(2)upper_boundtemplate<typenameCompatibleKey>iteratorupper_bound(constCompatibleKey&x)const;template<typenameCompatibleKey,typename iteratorupper_bound(constCompatibleKey& pare&(3)template<typenameLowerBounder,typenameUpperBounder>std::pair<iterator,iteratorrange(LowerBounderlower,UpperBounderupper)const;5、字符串与文本处理c++在stl库中提供了一个string类用以代替c语言的char*来实现字符串功能,不过的得自己来实现,和c#的字符串函数比起来简直弱爆了。boost库在头文件<boost/algorithm/string.hpp>中提供了字符串处理函数用以帮助实stringstr1("oabc-*-ABC-*-aBcgoodbye");vector<string>SplitVec;//#2:Searchfortokenssplit(SplitVec,str1,is_any_of("-*"), press_on);//SplitVec=={"abc","ABC","aBcgoodbye"}上述代码就提供了一个split的功能大小写转换涉及到四个函数:to_upper()、to_upper()以及xxx_copy的版本。cout<<to_upper_copy(string("oworld"))<<Trimming函数主要有trim(trim_left()trim_right()和他们的xxx_copy和xxx_if版本。cout<<trim_copy(std::string("oworld"))<<cout<<trim_copy_if(std::string(",,,oworld"),is_any_of(",.:"))<<endl;Predicates函数主要有:starts_with()、ends_with()、contains()、equals()、 pare()、all()以及他们的ixxxcout<<(ends_with("oworld","world")?"true":"false")<<查找算法有好几种:find()()find_last()find_nth()find_head()find_tail()find_token()、autoresult=find_("oworld","world");cout<<"can'tfindresult"<<endl;cout<<result<<其中result是一个boost::iterator_rangestrings("ocout<<s.substr(find_(s,"wo").begin()-s.begin())for(autoit=make_find_iterator(str1,_finder("abc",is_iequal()));!it.eof();{cout<<copy_range<std::string>(*it)<<}boost把erase和replace函数分开来列了,这样的好处是命名比较清晰,但不好的地方replace的函数有replace_all()、replace_()、replace_last()以及它们的变体,加共有20cout<<replace_all_copy(string("oworld"),"l","-")<<split函数的用法:stringstr1("oabc-*-ABC-*-aBcgoodbye");vector<string>SplitVec;split(SplitVec,str1,is_any_of("- press_on参数,它可以吧连续多个分隔符当一个,默认没另外,boost把find_all函数也分到splitstringstr1("oabc-*-ABC-*-aBctypedefvector<iterator_range<string::iterator>>find_vector_type;find_vector_typeFindVec;ifind_all(FindVec,str1,"abc"Join函数则是和splitstd::array<string,3>k={"o","world",cout<<join(k,"-");//输出结果为:这样的重载形式会更好点(当然,自己封一个也不难join("-","o","world","123",6、多线程支持boost::thread类就代表一个可执行的线程。缺省构造函数创建一当前执行线程目前由Boost线程库创建的线程对象功能还不是很强大。事实上它只能做两项操作。线boost::thread::join(比如设置优先级,甚至是取消线程。然而,由于要在普遍适用(portable)的接口中加这些操作不是简单的事,目前仍在如何将这些操组加入到Boost线程库中#include<boost/thread/thread.hpp>#include<iostream>void{std::cout"oworld,I'ma<<}intmain(intargc,char*{return}任何写过多线程程序的人都知道避免不同线程同时共享区域的重要性如果一个线程要(mutex,mutualexclusion的缩写。一个互斥体一次只允许一个线程共享区。当一互斥体的概念有不少变种。Boost线程库支持两大类互斥体,包括简单互斥体(simple和递归互斥体(recursivemutexdeadlock就可以对互斥体多次上锁,当然也必须同样次数来保证其他线程可以对这个互斥体上有代价的。所以Boost线程库允许你根据不同的需要使用最有效率的互斥体类型。Boost程库提供了6如果互斥体上锁之后没有就会发生死锁。这是一个很普遍的错误,Boost线程库就是将其变成不可能(至少时很。直接对互斥体上锁和对于Boost线程库的用户来说是不可能的。mutex类通过teypdef定义在RAII中实现的类型来实现互斥体的上锁和解这也就是大家知道的ScopeLock模式。为了构造这些类型,要传入一个互斥体的。构函数对互斥体加锁,析构函数对互斥体。C++保证了析构函数一定会被调用,所以即是有异常抛出,互斥体也总是会被正确的ScopeLock模式可以保证一个线程,因为它们的状态并没有这样做。下面给出了一个使用boost::mutex的最简单的例子。例子创建了两个新的线程,每个程都有10次循环,在std::cout上打印出线程id和当前循环的次数,而main函数等待个线程执行完才结束。std::cout就是共享资源,所以每一个线程都使用一个全局互斥体来#include<boost/thread/thread.hpp>#include#include<iostream>boost::mutexio_mutex;structcount{count(intid):id(id){}voidoperator()(){for(inti=0;i<10;{std::cout<<id<<":<<i<<}}intintmain(intargc,char*{boost::threadthrd1(count(1));boost::threadthrd2(count(2));return0;}除了使用Boost.Bind#include<boost/thread/thread.hpp>#include<boost/thread/mutex.hpp>#include<boost/bind.hpp>#include<iostream>boost::mutexio_mutex;voidcount(intid){for(inti=0;i<10;{std::cout<<id<<":"<<i<<std::endl;}}intmain(intargc,char*{boost::threadthrd1(boost::bind(&count,1));boost::threadthrd2(boost::bind(&count,2));return0;}必须在等待的时候将互斥体,以便其他线程可以共享资源并改变其状态。它还得保证从等到得线程返回时互斥体是被上锁得。当另一个线程改变了共享
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 垃圾渗滤液处理运维技师考试试卷及答案
- 2025年中石化芜湖石油分公司招聘8人笔试历年参考题库附带答案详解
- 2025山东省国控设计集团有限公司社会招聘8人笔试历年参考题库附带答案详解
- 2025山东东营金茂铝业高科技有限公司招聘42人笔试历年参考题库附带答案详解
- 2025国企食堂面向社会招聘笔试历年参考题库附带答案详解
- 2025四川宜宾市高县国盛劳务派遣有限责任公司招聘劳务派遣人员1人笔试历年参考题库附带答案详解
- 2025南平建阳区文化讲解员招聘10人笔试历年参考题库附带答案详解
- 2025内蒙古鄂尔多斯市伊金霍洛旗天骄创投运营有限公司招聘19人笔试历年参考题库附带答案详解
- 2025内蒙古准格尔旗国众人力资源服务有限责任公司招考50人笔试历年参考题库附带答案详解
- 2025中土集团北方建设有限公司校园招聘笔试历年参考题库附带答案详解
- 2025年党纪法规知识测试题(含答案)
- 电梯型式试验规则
- 线材生产车间管理制度
- CJ/T 371-2011垃圾填埋场用高密度聚乙烯管材
- CJ 3057-1996家用燃气泄漏报警器
- 基于大数据的临床检验结果分析
- DBJ04T 292-2023 住宅物业服务标准
- 中药天花粉简介
- 2024-2025年全国高中数学联赛试题及解答
- 连续退火铜大拉线机性能参数及操作规范
- DB51∕T 2439-2017 高原光伏发电站防雷技术规范
评论
0/150
提交评论