`
Davidlwq
  • 浏览: 47297 次
  • 性别: 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模板元编程学习笔记(二)”主要围绕两个主题展开:数值计算和类型计算。 1. 数值计算 在提供的代码示例中,`binary`模板展示了如何使用模板元编程实现将十进制数转换为二进制...

    boost库boost库boost库boost库

    学习和使用Boost库可以显著提升C++程序员的效率,通过利用其强大的功能,开发者可以更专注于解决问题本身,而不是基础工具的实现。同时,Boost库也是C++社区的一个重要组成部分,参与其中可以与全球的C++专家交流,...

    BOOST学习资料整理收集

    2. **容器与迭代器**:Boost库提供了多种容器和迭代器,如`multi_index_container`,在特定场景下比STL更高效。 3. **智能指针**:`shared_ptr`和`unique_ptr`提供了智能内存管理,避免了内存泄漏问题。 4. **算法**...

    boost日志库的使用

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

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

    ### Boost库学习指南 #### 一、Boost库简介与价值 Boost库是一个广泛使用的开源C++库集合,它为开发者提供了丰富的工具集来简化和优化C++编程过程。该库的特点在于其高质量的代码和广泛的适用性,适用于多种操作...

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

    在IT领域,Boost库是一个非常重要的C++工具集,它为C++标准库提供了许多扩展功能,涵盖了并行计算、图形处理、数学算法等多个方面。本篇将详细讲解如何在CentOS7环境下编译Boost 1.69版本的静态库和动态库,并探讨其...

    超越c++标准库——boost程序库导论

    对于容器,Boost库提供了如Boost.Container,它扩展了标准库中的容器,增加了如非分配容器和可变大小数组等高级特性。Boost.MultiArray则为多维数组提供了一种高效且灵活的实现方式。 Boost库的算法部分包括了Boost...

    boost官方pdf文档

    Boost.Container库提供了多种容器,如vector、list、map等,它们在某些方面比标准库中的容器更强大,比如支持内存池技术,提高内存分配效率,同时还有非移动性的容器,适用于需要保持元素顺序的场景。 7. `...

    Boost库学习资料.rar

    在学习Boost库时,通常会先从基础部分开始,例如了解Boost的安装和配置,然后逐渐深入到各个特定库的使用。例如,Boost.Iterator库提供了各种迭代器适配器,使开发者能够创建自定义迭代器;Boost.Range库则提供了一...

    Boost程序库完全开发指南.pdf

    Boost是一个集众多功能于一身的C++程序库,它不仅功能丰富、构造精巧,而且...通过本书的学习,读者可以了解Boost库的构造原理和应用技巧,将这些知识应用到实际的C++软件开发中去,从而提升自己的开发效率和代码质量。

    c++_boost库下载学习

    ### c++_boost库下载学习 #### Boost库简介 Boost是一个免费、开源且全面的C++库集合,它为C++程序员提供了丰富的模板类和函数。Boost库在C++社区中享有极高的声誉,被广泛认为是除了C++标准库之外最值得信赖的第...

    boost.python 编写扩展python库

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

    C++ boost库,最新版本

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

    BOOST准标准C++库学习资料

    "智能指针的标准之争 Boost_vs_Loki.pdf"讨论了Boost中的智能指针(如shared_ptr、unique_ptr等)与Loki库中的智能指针之间的比较,这是C++资源管理的重要话题,因为智能指针能够自动管理对象生命周期,防止内存泄漏...

    boost库1.68版本Linux下编译的动态库和静态库

    Boost库是C++编程语言的一个开源库集合,它提供了许多高效、跨平台的工具和库,以增强C++的功能和可扩展性。1.68版本是Boost的一个稳定版本,包含了许多更新和优化,旨在提高性能和兼容性。在Linux环境下,Boost库...

Global site tag (gtag.js) - Google Analytics