当我们需要在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来说这显然空指针显然没意义。
分享到:
相关推荐
《Boost学习笔记》.pdf
在【标题】和【描述】中提到的“Boost模板元编程学习笔记(二)”主要围绕两个主题展开:数值计算和类型计算。 1. 数值计算 在提供的代码示例中,`binary`模板展示了如何使用模板元编程实现将十进制数转换为二进制...
2. **容器与迭代器**:Boost库提供了多种容器和迭代器,如`multi_index_container`,在特定场景下比STL更高效。 3. **智能指针**:`shared_ptr`和`unique_ptr`提供了智能内存管理,避免了内存泄漏问题。 4. **算法**...
Boost 是一个广泛使用的 C++ 库,由 C++ 标准库的开发者参与编写,旨在增强 C++ 的功能和实用性。Boost 提供了一系列跨平台的工具和库,适用于 Linux 和 Windows 系统。学习 Boost 对于提升 C++ 开发者的技能和效率...
在boost中有自带的日志库供开发人员使用但效率不是最高的: 加入头文件#include 即可引入日志库 boost中的log库有以下六种级别: BOOST_LOG_TRIVIAL(trace) << A trace severity message; BOOST_LOG_TRIVIAL...
在IT领域,Boost库是一个非常重要的C++工具集,它为C++标准库提供了许多扩展功能,涵盖了并行计算、图形处理、数学算法等多个方面。本篇将详细讲解如何在CentOS7环境下编译Boost 1.69版本的静态库和动态库,并探讨其...
Boost库是C++编程语言的一个开源库集合,它提供了许多高效、跨平台的工具和库,以增强C++的功能和可扩展性。1.68版本是Boost的一个稳定版本,包含了许多更新和优化,旨在提高性能和兼容性。在Linux环境下,Boost库...
### Boost库学习指南 #### 一、Boost库简介与价值 Boost库是一个广泛使用的开源C++库集合,它为开发者提供了丰富的工具集来简化和优化C++编程过程。该库的特点在于其高质量的代码和广泛的适用性,适用于多种操作...
对于容器,Boost库提供了如Boost.Container,它扩展了标准库中的容器,增加了如非分配容器和可变大小数组等高级特性。Boost.MultiArray则为多维数组提供了一种高效且灵活的实现方式。 Boost库的算法部分包括了Boost...
在学习Boost库时,通常会先从基础部分开始,例如了解Boost的安装和配置,然后逐渐深入到各个特定库的使用。例如,Boost.Iterator库提供了各种迭代器适配器,使开发者能够创建自定义迭代器;Boost.Range库则提供了一...
### c++_boost库下载学习 #### Boost库简介 Boost是一个免费、开源且全面的C++库集合,它为C++程序员提供了丰富的模板类和函数。Boost库在C++社区中享有极高的声誉,被广泛认为是除了C++标准库之外最值得信赖的第...
使用boost.python 编写扩展python库,使用mfc例子调用扩展的python库。 myPydll 工程为扩展python库,生成文件myPydll.dll,将该文件拷贝到python解释器可搜索的路径下,如我的电脑就是“C:\Python26\DLLs”,并改...
Boost是一个集众多功能于一身的C++程序库,它不仅功能丰富、构造精巧,而且...通过本书的学习,读者可以了解Boost库的构造原理和应用技巧,将这些知识应用到实际的C++软件开发中去,从而提升自己的开发效率和代码质量。
Boost.Container库提供了多种容器,如vector、list、map等,它们在某些方面比标准库中的容器更强大,比如支持内存池技术,提高内存分配效率,同时还有非移动性的容器,适用于需要保持元素顺序的场景。 7. `...
Boost社区的发起人Dawes本人就是C++标准委员会的成员之一。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。里面有许多具有工业强度的库,如graph库。STL集中在...
"智能指针的标准之争 Boost_vs_Loki.pdf"讨论了Boost中的智能指针(如shared_ptr、unique_ptr等)与Loki库中的智能指针之间的比较,这是C++资源管理的重要话题,因为智能指针能够自动管理对象生命周期,防止内存泄漏...