<!--
//
// 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>
