blob: 69815fb950809ff490e6ff12659642aa9f8ad448 [file] [log] [blame]
<!--
//
// Boost.Pointer Container
//
// Copyright Thorsten Ottosen 2003-2005. Use, modification and
// distribution is subject to the Boost Software License, Version
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// For more information, see http://www.boost.org/libs/ptr_container/
//
-->
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<section id="ptr_container.intro" last-revision="$Date: 2008-02-07 03:44:10 -0500 (Thu, 07 Feb 2008) $">
<title>Introduction</title>
<para>
This library provides standard-like containers that are suitable
for storing pointers to both polymorphic and non-polymorphic objects.
For each of the standard containers there is a pointer container
equivalent that takes ownership of the stored pointers in an exception
safe manner. In this respect it is intended to solve
the so-called <emphasis>polymorphic class problem. </emphasis>
</para>
<para>
The main advantages are
<itemizedlist>
<listitem> Exception-safe and fool proof pointer storage and manipulation.</listitem>.
<listitem> Exception-guarantees are generally much better than with standard containers (at least the strong guarantee</listitem>
<listitem> Notational convinience compared to the use of containers of smart pointers.</listitem>
<listitem> Iterators are automatically indirected so the comparison operations can be kept
on object basis instead of making/adding pointer based variants.</listitem>
<listitem> No memory-overhead as containers of smart_pointers can have.</listitem>
<listitem> Faster than using containers of smart pointers.</listitem>
<listitem> Provides an elegant solution to <code> vector< vector<T> > </code> performance
problems; simply use <code>ptr_vector< vector<T> ></code></listtem>
</para>
<para>
Below is given some example that show how the usage compares to a container of smart pointers:
<programlisting>
using namespace boost;
using namespace std;
class Poly
{
public:
virtual ~Poly() {}
void foo() { doFoo(); }
private:
virtual void doFoo()
{
int i;
++i;
}
};
//
// one doesn't need to introduce new names or live with long ones
//
typedef shared_ptr<Poly> PolyPtr;
//
// one doesn't need to write this anymore
//
struct PolyPtrOps
{
void operator()( const PolyPtr & a )
{ a->foo(); }
};
int main()
{
enum { size = 2000000 };
vector<PolyPtr> svec
ptr_vector<Poly> pvec;
for( int i = 0; i < size; ++i )
{
svec.push_back( PolyPtr( new Poly ) );
pvec.push_back( new Poly ); // no extra syntax
}
for_each( svec.begin(), svec.end(), PolyPtrOps() );
for_each( pvec.begin(), pvec.end(), mem_fun_ref( &Poly::foo ) );
}
</programlisting>
</para>
</section>