`
Davidlwq
  • 浏览: 46793 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

boost学习笔记之Pointer Container库

阅读更多

当我们需要在stl的库中装入多态类的对象时,通常的做法是在容器里装入父类的指针,然后手动释放,如我有以下两个类

class Light
{
  ....
}

class PointLight:public Light
{
   ...
}

std::vector<Light*> lights;
lights.push_back(new PointLight());
 

 

 

上面的做法有如下几点弊端:

1.容易忘记释放掉指针,造成内存泄漏;

2不是异常安全的

 

boost中的Pointer Container库为我们提供了一种安全的方法来实现容器中的多态,并且其官方文档中也列举了一些优点如异常安全、速度快(相对于smart pointer而言)等,有兴趣的读者可以自己去看,这里讲下它的使用方法。

 

 

基本使用

 

boost::ptr_vector<Light> lights;
lights.push_back(new PointLight());

 如上所示,当lights这个对象柝构里会自动释放掉其包含的指针指向的对象。

 

间接接口

lights[0].getColor();

从上可以看出,我们取出的元素可以像对象而不是指针一样使用

 

关联容器

对于stl中的几乎所有窗口pointer container库几乎都提供了相应的类,当然也包括关联窗口。

当我们想使用boost::ptr_set这个类时,必须要求这个类的<操作符有定义,如

inline bool operator<(const Light& l1,const Light& l2)
{ 
   return l1.getColor().getRed() < l2.getColor().getRed();
}

boost::ptr_set<Light> lights;
lights.insert(new PointLight());
lights.insert(new PointLight());

对于boost::multimap这个类要注意,当向里插入的时候键值必须是一个左值(由于要确保异常安全),否则编译会不通过,如

boost::ptr_multimap<std::string,Light> lights;string a = "a",b="b";
lights.insert(a,new PointLight());
lights.insert(b,new PointLight());

如下代码会报错

lights.insert("aa",new PointLight());

空指针

默认情况下,如果你插入一个空指针会抛出异常的,如果你想允许插入空指针,则必须提前声明,如
boost::ptr_vector<boost::nullable<Light>> lights;
lights.push_back(NULL);
一旦你允许空指针,则使用前必须检查,如

typedef boost::ptr_vector<boost::nullable<Light>> Light_type;
for(Light_type
::iterator i = lights.begin();
     i != lights.end(); ++i )
{
    if( !boost::is_null(i) ) // always check for validity
        i->getColor();
}
或者如何容器支持随机存取的话也可以用如下的方法

for( Light_type::size_type i = 0u; 
     i != lights.size(); ++i )
{
    if( !lights.is_null(i) )
         lights[i].getColor();
}
注意对于ptr_set和ptr_multiset来说这显然空指针显然没意义。
   

0
1
分享到:
评论

相关推荐

    Boost 模板元编程学习笔记(二)

    Boost 模板元编程学习笔记(二),开始你模板元编程的历程。C++,模板,标准库,元编程,教程,笔记

    boost日志库的使用

    在boost中有自带的日志库供开发人员使用但效率不是最高的: 加入头文件#include 即可引入日志库 boost中的log库有以下六种级别: BOOST_LOG_TRIVIAL(trace) &lt;&lt; A trace severity message; BOOST_LOG_TRIVIAL...

    Boost库学习指南 Boost库学习指南

    Boost库学习指南 Boost库学习指南 Boost库学习指南 Boost库学习指南

    Boost库学习指南

    Boost库学习指南 Boost库学习指南Boost库学习指南 Boost库学习指南

    C++ boost库,最新版本

    Boost社区的发起人Dawes本人就是C++标准委员会的成员之一。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。里面有许多具有工业强度的库,如graph库。STL集中在...

    boost库boost库boost库boost库

    boot库

    boost.python 编写扩展python库

    使用boost.python 编写扩展python库,使用mfc例子调用扩展的python库。 myPydll 工程为扩展python库,生成文件myPydll.dll,将该文件拷贝到python解释器可搜索的路径下,如我的电脑就是“C:\Python26\DLLs”,并改...

    BOOST学习资料整理收集

    BOOST学习资料整理收集

    Boost学习笔记

    Boost是C++标准库开发人员参与编写的,非常好。里面有各种数组、线程池、通信库等,是Linux、Window通用的东西。不学他,就落伍了。

    开发库boost1.59版本64位全库

    开发库boost1.59版本64位全库,包含代码及编译好的库,debug,release都有,需要的下载之后加载即可使用,支持跨平台操作

    boost学习资料下载

    boost学习资料 boost graph 库 boost中文说明

    c++ boost库1.73.0 boost最新版

    Boost社区建立的初衷之一就是为C++的标准化工作提供可供参考的实现,Boost社区的发起人Dawes本人就是C++标准委员会的成员之一。在Boost库的开发中,Boost社区也在这个方向上取得了丰硕的成果。在送审的C++标准库TR1...

    CentOS7环境下编译的boost 1.69静态库和动态库

    在CentOS7虚拟机环境下编译的boost 1.69版本的静态库和动态库,经过测试,编译的库能够正常使用

    boost boost库

    boost boost库 boost boost库boost boost库 boost boost库boost boost库boost boost库

    《Boost深入剖析之使用技巧》第四讲:Boost容器库(中).flv

    《Boost深入剖析之使用技巧》第四讲:Boost容器库(中).flv 如果你还在为自己写的程序存在各种野指针,内存泄漏,甚至崩溃的问题而苦恼的话,请使用boost;如果你还在为自己写的程序存在很多与Windows依赖的操作导致...

    Boost库定制安装更新版

    Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响...

    Boost库学习资料.rar

    Beyond+the+C+++Standard+Library(boost中文版) Boost程序库完全开发指南:深入C++_准_标准库 第3版 中文 Boost程序库探秘

    Boost C++扩展库

    Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。 Boost中比较有...

Global site tag (gtag.js) - Google Analytics