2.9. 指针容器

在你见过 Boost C++ 库的各种智能指针之后,应该能够编写安全的代码,来使用动态分配的对象和数组。多数时候,这些对象要存储在容器里——如上所述——使用 boost::shared_ptrboost::shared_array 这就相当简单了。

  1. #include <boost/shared_ptr.hpp>
  2. #include <vector>
  3.  
  4. int main()
  5. {
  6. std::vector<boost::shared_ptr<int> > v;
  7. v.push_back(boost::shared_ptr<int>(new int(1)));
  8. v.push_back(boost::shared_ptr<int>(new int(2)));
  9. }

上面例子中的代码当然是正确的,智能指针确实可以这样用,然而因为某些原因,实际情况中并不这么用。 第一,反复声明 boost::shared_ptr 需要更多的输入。 其次,将 boost::shared_ptr 拷进,拷出,或者在容器内部做拷贝,需要频繁的增加或者减少内部引用计数,这肯定效率不高。 由于这些原因,Boost C++ 库提供了 指针容器 专门用来管理动态分配的对象。

  1. #include <boost/ptr_container/ptr_vector.hpp>
  2.  
  3. int main()
  4. {
  5. boost::ptr_vector<int> v;
  6. v.push_back(new int(1));
  7. v.push_back(new int(2));
  8. }

boost::ptr_vector 类的定义在 boost/ptr_container/ptr_vector.hpp 里,它跟前一个例子中用 boost::shared_ptr 模板参数来初始化的容器具有相同的工作方式。 boost::ptr_vector 专门用于动态分配的对象,它使用起来更容易也更高效。 boost::ptr_vector 独占它所包含的对象,因而容器之外的共享指针不能共享所有权,这跟 std::vector<boost::shared_ptr<int> > 相反。

除了 boost::ptr_vector 之外,专门用于管理动态分配对象的容器还包括:boost::ptr_dequeboost::ptr_listboost::ptr_setboost::ptr_mapboost::ptr_unordered_setboost::ptr_unordered_map。这些容器等价于C++标准里提供的那些。最后两个容器对应于std::unordered_setstd::unordered_map,它们作为技术报告1的一部分加入 C++ 标准。 如果所使用的 C++ 标准实现不支持技术报告1的话,还可以使用 Boost C++ 库里实现的 boost::unordered_setboost::unordered_map