ptr_vector指針向量
基本概念
Boost學習之指針容器
- 基本概念: Boost::ptr_vector屬于Boost庫中 pointer contiainer 的其中一個,提供了與標準容器相似的行為,但是維護的是堆分派的對象。
- 使用場景:當需要一個包含指針的容器時,如存放一些不可拷貝的對象,或想在容器中存放基類以實現多態,可以直接使用標準容器存放指針,但是清空或刪除容器時,不易保證異常安全回收資源,另外可以使用存放 shared_ptr 的標準容器。
// file : demo1.cpp
// description : show the base usage of ptr_vector
#include <iostream>
#include <string>
#include <boost/ptr_container/ptr_vector.hpp>
using namespace std;
using namespace boost;
class Animal{
public:
explicit Animal( const string& name): name_( name ) {}
virtual ~Animal(){
cout << "destructor Animal" << endl; }
virtual void Bark(){
cout << "Animal " << name_ << " brak" << endl; }
const string& name() { return name_; }
private:
string name_;
};
class Cat : public Animal{
public:
explicit Cat( const string& name ) : Animal( name ) {}
virtual void Bark(){
cout << "Cat " << name() << " brak" << endl; }
virtual ~Cat(){
cout << "destructor Cat" << endl;
}
};
class Dog : public Animal{
public:
explicit Dog( const string& name ) : Animal( name ) {}
virtual void Bark(){
cout << "Dog " << name() << " brak" << endl; }
virtual ~Dog(){
cout << "destructor Dog" << endl;
}
};
// 1, 采用 vector<Base *> 將基類指針存放于標準容器
void test1()
{
vector<Animal* > pData; // 1,包含基類指針的標準容器
pData.push_back( new Animal( "a" ) );
pData.push_back( new Cat( "c" ) );
pData.push_back( new Dog( "d" ) );
for( auto iter = pData.begin();
iter != pData.end();
++iter )
{ (*iter)->Bark(); }
for( auto iter = pData.begin();
iter != pData.end();
++iter )
{ delete *iter; } // 2,需要手工釋放資源,無法保證異常安全性
}
// 2, 采用 vector< shared_ptr<Base> > 將智能指針存放于標準容器
void test2()
{
vector< shared_ptr<Animal> > pData; // 1,包含智能指針的標準容器
pData.push_back( shared_ptr<Animal>( new Animal( "a" ) ) ); // 2,需要顯式創建智能指針
pData.push_back( shared_ptr<Animal>( new Cat( "c" ) ) );
pData.push_back( shared_ptr<Animal>( new Dog( "d" ) ) );
for( auto iter = pData.begin();
iter != pData.end();
++iter )
{ (*iter)->Bark(); }
// 3, 內存自動釋放
}
// 3, 采用 ptr_vector 指針容器
void test3()
{
ptr_vector<Animal> pData; // 1,基類指針的容器
pData.push_back( new Animal( "a" ) ); // 2, 支持與標準容器類似的操作 vector.push_back
pData.push_back( new Cat( "c" ) ); // 3, 基類指針支持多態
pData.push_back( new Dog( "d" ) );
for( auto iter = pData.begin(); // 2, 支持與標準容器類似的操作 iterator
iter != pData.end();
++iter )
{ iter->Bark(); } // 3, 基類指針支持多態
}
g++ -o demo demo1.cpp -std=c++11
int main()
{
test1();
test2();
test3();
}