Boost学习之指针容器--pointer_container
有時,我們可能需要一個包含指針的容器.比如存放一些不可拷貝的對象或者想在容器里存放基類以實現多態.盡管我們可以直接定義存放指針的STL容器,不過這樣并不方便,我們得處處小心,在清空或刪除容器里的元素時我們要保證異常安全地回收指針所指向的對象,以防內存泄漏.
一個好的辦法是使用共享智能指針的容器,如std::vector<boost::shared_ptr<T> >,不過這樣做的話智能指針所帶來的開銷顯然太大了.
Boost.pointer_container提供了和標準相似的容器,只是它維護的是指針所指的對象.
要使用Boost.pointer_container只需包含下面的頭文件即可
#include <boost/ptr_container/ptr_container.hpp>?
一個簡單的例子
運行結果:
A Here is B C:hello C:world應該注意到,這里沒有內存泄漏,在ptr_vector<base>析構時會刪除容器內指針所指向的對象.
本例中,我們使用了ptr_vector,在Boost.pointer_container庫中包含的指針容器有:
ptr_vector ptr_list ptr_deque ptr_array ptr_set ptr_multi_set ptr_map ptr_multimap除ptr_array以外,其它所有的容器都能與STL一一對應起來,除了以指針方式存入以外,使用方法沒什么區別.至于ptr_array,它不過是Boost.Array的簡單包裝罷了.
毫無懸念地,這些指針容器是STL兼容的,比如上面的循環打印用這句代替:
for_each(data.begin(), data.end(), mem_fun_ref(&base::print));?
其它問題
空值
如果向容器中插入NULL, 默認情況是拋出一個異常. 如果想讓指針容器能保存NULL指針,那么聲明容器時就必須使用nullable來包裝數據類型,例如:
boost::ptr_vector< boost::nullable<base> > animals_type;克隆能力
默認情況下,容器或迭代器之間的賦值并不是簡單的指針復制,而是使用拷貝構造函數產生一個新的拷貝.比如:
顯示兩次構造,兩次拷貝,四次析構. 說明ptr_vector<C> dataX = data;使用了拷貝構造函數生成了自己的對象實例.
我們可以通過定義T* new_clone(const T&)來改變這種行為:
在上例的main()函數之前定義:
這次運行結果顯示它調用了兩次new_clone而不是拷貝了.
總結
以上是生活随笔為你收集整理的Boost学习之指针容器--pointer_container的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广发diy信用卡3倍积分商户有哪些?mc
- 下一篇: A20 文件系统预装APK