boost::ptr_container

トップページ > コンテナとイテレータ >

abstract

必要なヘッダ
<boost/ptr_container/ptr_*.hpp>
出来ること
ポインタを格納するコンテナ
リファレンス
en

sample

#include <iostream>
#include <boost/ptr_container/ptr_vector.hpp>
using namespace std;

class object
{
public:
	void method() { cout<<"Method"<<endl; }
	~object() { cout<<"Destructed"<<endl; }
};

int main()
{
	boost::ptr_vector<object> v;
	v.push_back( new object );
	v.push_back( new object );
	v.push_back( new object );

	v[0].method(); // v[0]->method じゃないよ
}

実行結果

Method
Destructed
Destructed
Destructed

etc

ptr_vector<T> は基本的に vector<T*> みたいなもんですが、

  1. ptr_vectorが所有権を持つ(ptr_vectorが無くなるときに中身が全部自動的にdeleteされる)
  2. operator[]でアクセスしたときやイテレータで参照外したときはポインタじゃなくて参照が返る

辺りが違いです。多態したいのでvector<T>ではダメなのだけど、vector<T*> にするとdeleteの管理が面倒で、でも vector< shared_ptr<T> > は色々ややこしい…あと参照カウントのメモリ管理オーバーヘッドが痛い… という状況でptr_vectorを使うという用途が想定されています。 他にptr_listやptr_dequeやptr_setやptr_mapも勿論用意されております。

ただ、2. の機能のためか、STLのアルゴリズムが色々適用できなかったり (代替アルゴリズム関数がメソッドとして実装されてはいます)するのがちょっと残念なところ。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0