【技术】Boost系列
文章平均质量分 86
多则惑少则明
让天下没有难测试的项目。专注于测试开发领域,近9+年的工作实战经验,主攻方向包括:
0-1/中期/成熟类大型/复杂系统的业务测试
自动化测试平台&框架开发;
打造质量体系及沉淀质量方法论
个人邮箱zpphnkjxy@126.com
文章周末定时更新,其余时间不定时更新
展开
-
Boost 库 简介
Boost 库:99个库(组件),分为20大类字符串与文本处理容器迭代器算法图像处理模板元编程并发编程等Boost的独特之处:把C++类的声明和实现都放在了一个文件中,而不是分成两个文件,也就是“.h+.cpp”,故文件的后缀是.hpp开发环境:windowXP+visual studio 2005标准库:STLport5.21版开发环境设置原创 2014-02-21 10:00:27 · 674 阅读 · 0 评论 -
checked_delete 原理剖析
场合:删除一个动态分配的对象时,必须调用它的析构函数。如果这个类型是不完整的,即只有声明没有定义,那么析构函数可能会没被调用。这是一种潜在的危险状态,所以应该避免它。作用:checked_delete在对象析构时执行一个静态断言,测试类是否可知,以确保析构函数被执行。对于动态分配的数组,同样有一个称为 checked_array_delete的模板函数。 确保:被删除的类型必原创 2014-03-02 14:51:46 · 1044 阅读 · 0 评论 -
Any容器
1作用:提供了存储不同类型的对象到标准库容器中的能力2any对它所保存的类型有以下要求:●CopyConstructible 它必须可以复制这个类型●Non-throwingdestructor 就象所有析构函数应该的那样3在any中使用指针时,为什么应该把裸指针包装成智能指针?因为:因为对一个裸指针的析构不会调用delete或delete[]算子4用法原创 2014-03-02 15:37:56 · 511 阅读 · 0 评论 -
对STL的增加之算法篇:foreach/数学领域库
foreach 1、作用:代替for(int i=0;i优点:1)foreach库使用如下2个宏提供类似的序列变量,不需要迭代器,不需要新的函数对象; BOOST_FOREACH; BOOST_REVERSE_FOREACH;使用前提:序列式稳定的string str("zpp");BOOST_FOREACH(char &c,str);//遍历容器{原创 2014-03-11 20:18:03 · 837 阅读 · 0 评论 -
对C++的改进之容器篇:array/multi_array/dynamic_bitset/Unordered/bimap/tuple/variant
1含义:包装C++内建的数组,编译期指定数组的维数;例如array等价于int a[5]提供类似STL容器的接口:本质:对静态数组的包装,原始数组作为它代理的对象-------可以理解为代理模式2、使用条件:对性能要求很高,或不需要动态数组时3、实现摘要---模板类template// 数组元素的类型和大小class array{public: T原创 2014-03-11 18:43:41 · 1340 阅读 · 0 评论 -
对C++容器的增加篇:circular_buffercircular_buffer/any
circular_buffer1、特点1)循环缓冲区;2)大小固定---实现了大小固定的循环对象;当到达容器末尾时自动循环利用容器另一端的空间;3)内存空间不能动态增长,循环使用,类似首尾相连的环。2、实现摘要class circular_buffer{begin();end();operator[]();at();front();b原创 2014-03-11 19:45:09 · 2081 阅读 · 0 评论 -
boost::swap 的实现原理
在 STL 已提供std::swap 时为什么还有必要使用 boost::swap?std::swap 的行为等效于: template void swap ( T& a, T& b ){ T c(a); a=b; b=c;}现在,对于存储大量数据的类,此方法可能不是交换数据的最有效方法,因为 swap 涉及到一个转载 2014-03-12 10:38:29 · 1496 阅读 · 0 评论 -
Smart_ptr
scoped_ptr用于确保能够正确地删除动态分配的对象与auto_ptr的区别:区别主要在于对拥有权的处理:(1)scoped_ptr它不能转让所有权,永远不能被复制或被赋值!【拷贝构造函数+赋值操作符为私有的(禁止复制操作)】 而auto_ptr可以。scoped_ptr拥有它所指向的资源的所有权,并永远不会放弃这个所有权(2)包含scoped_ptr原创 2014-03-01 12:55:28 · 719 阅读 · 0 评论 -
对STL的增加之函数对象篇:实现函数与回调bind/Lambda/function/signals
函数与回调:bind:是函数适配器的增强,可以适配任意可调用对象,包括了函数指针、函数引用、函数对象,把它们变成一个新的函数对象。function库:对函数指针类型的增强,能容纳任意的可调用对象,配合bind。signals库:实现了观察者模式。——————————————————————————————————---------------------------------原创 2014-03-11 20:52:33 · 1000 阅读 · 0 评论 -
模板元编程----boost组件基础
模板元编程----boost组件基础1、特点1)模板元编程产生的元程序---在编译期执行的程序2)操作的对象---不是普通变量,因而不是使用运行时的C++关键字如(if,else ,for)3)常用的是编译期的整数常量:enum,static2、模板元编程与普通编程的区别模板元编程与普通运行时编程的不同点:1)普通程序时运行时处理数据;2)元数据不同普通的运原创 2014-03-11 21:38:38 · 1585 阅读 · 0 评论 -
Boost.Compressed_pair 原理
与std::pair不同之处在于,boost::compressed_pair对模板参数进行评估,看其中有没有空的参数,如果有,使用空类优化技术来压缩pair的大小。场合:常用于存放一对对象,其中之一或两个都可能是空的。转载 2014-03-01 12:20:18 · 2106 阅读 · 0 评论 -
hash表的实现
方法一:类似STL中hashtable的实现:摘录自《STL源码剖析》5.7.7节hashtable以质数来设计表格大小,预先计算好了28个质数,大约都是两倍的关系递增,查询28个质数中,“最接近且大于元素数目”的数字作为vector的长度,如果需要重新分配,则分配下一个质数长度的vector。Bucket所维护的linked list不采用STL的list或者slist(直接指针操作),原创 2014-03-19 10:45:44 · 929 阅读 · 0 评论 -
Boost库--指针容器
指针容器1】指针容器和标准容器一一对应,指针容器由标准容器和容器适配器实现的。例如:vector+适配器 实现出ptr-vector 。ptr_vector基于标准容器vector,大部分操作都转发给内部的容器实现。但构造函数ptr_vector(n)的行为不同于vector,它不会创建n个元素,而是保留n个元素的空间,相当于调用reserve(n).同理:原创 2014-03-19 21:54:32 · 1026 阅读 · 0 评论 -
Lambda库
编写很多小的函数对象的缺点:1, 大量的小类分散在代码中,这样很难进行维护2,理解函数对象被调用处的代码会很难Boost.Lambda :1】可以创建直接定义和调用的函数对象,或者把它保存起来晚一些再调用;2】增加了控制结构(使用嵌套的循环结构,把算法表达式写入循环中)、表达式到函数对象的自动转换,还支持在 lambda 表达式中的异常处理Lambda库优点:原创 2014-03-02 21:01:48 · 945 阅读 · 0 评论 -
bind的奥秘
作用:1、Bind 是已有的标准库函数bind1st和bind2nd的泛化; 2、减少了对函数指针和类成员指针使用适配器的需要,即不需要再使用ptr_fun和mem_fun_ref 【使用绑定的语法是一致的,不论是用于值语义或是指针语义,甚至是用于智能指针】 3、 对compose1和compose2,select1st和se原创 2014-03-02 19:17:46 · 877 阅读 · 0 评论 -
multi_array
C++创建多维数组int* pOneDimArr = new int[10]; //新建一个10个元素的一维数组 pOneDimArr[0] = 0; //访问 int**pTwoDimArr = new int[10][20]; //错误! pTwoDimArr[0][0] = 0; //访问问题,new int[10][20]返转载 2014-02-25 11:04:16 · 915 阅读 · 0 评论 -
tuple
返回值的捆绑pair使用std::pair来定义函数的返回值类型(顾名思义,std::pair可以将两个值凑成一对),像这样:std::pairint,int> DevideInts(int n,int d){ return std::pairint,int>(n/d,n%d);}缺点只能提供两个返回值的捆绑,如果现在需要返回三个int呢方法一:自己定义一转载 2014-02-25 14:04:35 · 708 阅读 · 0 评论 -
tuple的构造函数
tuple的构造函数 template class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> class tuple : public detail::map_tuple_to_cons<T0,T1,转载 2014-02-25 14:08:28 · 1330 阅读 · 0 评论 -
Tuple的取值过程/求长度
要求someTuple.get(); // get是模板函数要求:N必须得是编译期可计算的常量为什么你不能试图用变量作“下标”来获取tuple中的变量?someTuple.get(N); // N为变量-->错误原因就在于get函数的返回值用户可以将不同形式的变量保存在tuple中,但是get函数是不能在运行期决定它的返回值的,返回值必须在编译期就决议出来。tup转载 2014-02-25 14:14:37 · 4504 阅读 · 0 评论 -
any
要点1,它本身不能是模板类,因为如果它是模板,你必须为它的具现化提供模板参数。这样就不能让同一个对象接受任意类型的数据。2, 容纳任意类型原因:构造函数和赋值函数,均是模板函数,可以接受任意的类型,将值存入内部的模板类holder中。因此,any实际上是一个包装类。3,智能指针的选择:auto_ptr,scoped_ptr不能放入容器shared_ptr可以放入容器4,应用与转载 2014-02-25 14:59:28 · 681 阅读 · 0 评论 -
使用boost::any实现virtual template成员函数
目前的C++标准不允许模板函数为虚函数,any可以一定程度上满足这种需要,例如,class Base{public:virtual voidAccept(boost::any anyData){...}};class Derived:public Base{public:virtual voidAccept(boost::any anyData)转载 2014-02-25 15:00:36 · 770 阅读 · 0 评论 -
静多态,动多态对比
静态多态 泛型编程里的常用手法 STL里屡见不鲜。静多态的静态特性:所有的类型必须在编译期确定静多态,动多态对比通过继承实现的多态是绑定的和动态的:1,绑定:对于参与多态行为的类型,它们的接口在公共基类中就预先确定2,动态:接口的绑定是运行期(动态)完成的通过模式实现的多态是非绑定的和静态的:1,非绑定:对于参与多态行为的类型,它们的接口没有预先确定1,原创 2014-02-25 16:41:29 · 1095 阅读 · 0 评论 -
空基类优化
空基类:类----在运行期内部表示不耗费内存;即类只包含非虚成员函数静态数据成员(非静态数据,虚函数,虚基类运行期耗费内存)原理:当空类作物基类时,只要不与同一类型的另一个对象或子对象分配同一地址,就不需为其分配任何空间=====空基类优化注:BOOST中的compressed_pair使用此原理。原创 2014-02-25 20:53:58 · 824 阅读 · 1 评论 -
模板实现---桥接模式
摘录自《C++ template》 继承实现桥接模式 模式实现桥接模式 自己对模板实现桥模式的理解:代码实现如下:template//模板类 class interface{impl body;void operationA(){body.operationA();}void operationB(){body.operationB()原创 2014-02-25 16:53:00 · 832 阅读 · 0 评论 -
boost 的Conversion库
包含4个函数:polymorphic_castpolymorphic_downcastnumeric_castlexical_cast与C++风格转型的区别:它们明确无误地表达了程序员的意图polymorphic_cast dynamic_cast的这种对指针和引用类型的不同行为:指针---- 转型失败---空指针引用---原创 2014-03-01 13:24:44 · 962 阅读 · 0 评论 -
Operators库/Barton-Nackmann 技巧
作用:提供一组完整的比较操作符● 提供一组完整的算术操作符● 提供一组完整的迭代器操作符允许你只定义所需的比较或算术操作符的一个子集,然后基于你提供的操作符自动定义其它的操作符例如:依照operator来实现operator>,operator=操作 其他的操作符实现类似。注:左边为用户实现的,右边是自动实现的。原创 2014-03-02 15:18:59 · 738 阅读 · 0 评论 -
常见问题:如何在算法中使用智能指针
原因:由于在智能指针中保存的是指针的值而不是它们所指向的指针的值,因此在标准库容器中使用智能指针有一个常见的问题,就是如何在算法中使用智能指针;算法通常需要访问实际对象的值,而不是它们的地址。例如,你如何调用std::sort并正确地排序?不能直接比较两个智能指针的值办法1:只要用一个解引用智能指针的谓词,使得可以在标准库的算法里使用引向智能指针的迭代器。原创 2014-03-01 13:01:15 · 667 阅读 · 0 评论 -
对标准库容器的扩展:Variant/tuple
1.union的扩展联合(union):只能存储C++内建类型variant:可以存储自己定义一组允许使用的类型,可以支持所有类型2,用法 3,访问器:variant访问机制要让print_visitor成为variant的一个访问器,(1)我们要让它派生自boost::static_visitor以获正确的typedef(result_type),(2)并原创 2014-03-02 16:59:36 · 1176 阅读 · 0 评论 -
C++ 程序员自信心曲线图
学习C++很长时间了,也看过很多程序员学习C++的历程。总体来说,C++是一个“双刃剑”式的语言,只有那些熟悉他的人才能把C++这门语言用好。Linus曾说过:“C++是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它”。是的,C++并不是一门速成的语言,其是一门需要长时间磨练和学习的语言,那些说自己熟悉C++语言的程序只能算是轻浮的。详见“21天教你学会C++ ”。下面转载 2014-04-27 14:36:43 · 762 阅读 · 0 评论