| <?xml version="1.0" encoding="utf-8" ?> |
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
| <meta name="generator" content="Docutils 0.3.10: http://docutils.sourceforge.net/" /> |
| <title>Boost Pointer Container Library</title> |
| <meta name="author" content="Thorsten Ottosen" /> |
| <meta name="date" content="27th of October 2007" /> |
| <meta name="copyright" content="Thorsten Ottosen 2004-2007. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt)." /> |
| <style type="text/css"> |
| |
| /* |
| :Author: David Goodger |
| :Contact: goodger@users.sourceforge.net |
| :Date: $Date: 2008-07-16 17:03:47 -0400 (Wed, 16 Jul 2008) $ |
| :Revision: $Revision: 47494 $ |
| :Copyright: This stylesheet has been placed in the public domain. |
| |
| Default cascading style sheet for the HTML output of Docutils. |
| |
| See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to |
| customize this style sheet. |
| */ |
| |
| /* "! important" is used here to override other ``margin-top`` and |
| ``margin-bottom`` styles that are later in the stylesheet or |
| more specific. See http://www.w3.org/TR/CSS1#the-cascade */ |
| .first { |
| margin-top: 0 ! important } |
| |
| .last, .with-subtitle { |
| margin-bottom: 0 ! important } |
| |
| .hidden { |
| display: none } |
| |
| a.toc-backref { |
| text-decoration: none ; |
| color: black } |
| |
| blockquote.epigraph { |
| margin: 2em 5em ; } |
| |
| dl.docutils dd { |
| margin-bottom: 0.5em } |
| |
| /* Uncomment (and remove this text!) to get bold-faced definition list terms |
| dl.docutils dt { |
| font-weight: bold } |
| */ |
| |
| div.abstract { |
| margin: 2em 5em } |
| |
| div.abstract p.topic-title { |
| font-weight: bold ; |
| text-align: center } |
| |
| div.admonition, div.attention, div.caution, div.danger, div.error, |
| div.hint, div.important, div.note, div.tip, div.warning { |
| margin: 2em ; |
| border: medium outset ; |
| padding: 1em } |
| |
| div.admonition p.admonition-title, div.hint p.admonition-title, |
| div.important p.admonition-title, div.note p.admonition-title, |
| div.tip p.admonition-title { |
| font-weight: bold ; |
| font-family: sans-serif } |
| |
| div.attention p.admonition-title, div.caution p.admonition-title, |
| div.danger p.admonition-title, div.error p.admonition-title, |
| div.warning p.admonition-title { |
| color: red ; |
| font-weight: bold ; |
| font-family: sans-serif } |
| |
| /* Uncomment (and remove this text!) to get reduced vertical space in |
| compound paragraphs. |
| div.compound .compound-first, div.compound .compound-middle { |
| margin-bottom: 0.5em } |
| |
| div.compound .compound-last, div.compound .compound-middle { |
| margin-top: 0.5em } |
| */ |
| |
| div.dedication { |
| margin: 2em 5em ; |
| text-align: center ; |
| font-style: italic } |
| |
| div.dedication p.topic-title { |
| font-weight: bold ; |
| font-style: normal } |
| |
| div.figure { |
| margin-left: 2em } |
| |
| div.footer, div.header { |
| clear: both; |
| font-size: smaller } |
| |
| div.line-block { |
| display: block ; |
| margin-top: 1em ; |
| margin-bottom: 1em } |
| |
| div.line-block div.line-block { |
| margin-top: 0 ; |
| margin-bottom: 0 ; |
| margin-left: 1.5em } |
| |
| div.sidebar { |
| margin-left: 1em ; |
| border: medium outset ; |
| padding: 1em ; |
| background-color: #ffffee ; |
| width: 40% ; |
| float: right ; |
| clear: right } |
| |
| div.sidebar p.rubric { |
| font-family: sans-serif ; |
| font-size: medium } |
| |
| div.system-messages { |
| margin: 5em } |
| |
| div.system-messages h1 { |
| color: red } |
| |
| div.system-message { |
| border: medium outset ; |
| padding: 1em } |
| |
| div.system-message p.system-message-title { |
| color: red ; |
| font-weight: bold } |
| |
| div.topic { |
| margin: 2em } |
| |
| h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, |
| h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { |
| margin-top: 0.4em } |
| |
| h1.title { |
| text-align: center } |
| |
| h2.subtitle { |
| text-align: center } |
| |
| hr.docutils { |
| width: 75% } |
| |
| img.align-left { |
| clear: left } |
| |
| img.align-right { |
| clear: right } |
| |
| img.borderless { |
| border: 0 } |
| |
| ol.simple, ul.simple { |
| margin-bottom: 1em } |
| |
| ol.arabic { |
| list-style: decimal } |
| |
| ol.loweralpha { |
| list-style: lower-alpha } |
| |
| ol.upperalpha { |
| list-style: upper-alpha } |
| |
| ol.lowerroman { |
| list-style: lower-roman } |
| |
| ol.upperroman { |
| list-style: upper-roman } |
| |
| p.attribution { |
| text-align: right ; |
| margin-left: 50% } |
| |
| p.caption { |
| font-style: italic } |
| |
| p.credits { |
| font-style: italic ; |
| font-size: smaller } |
| |
| p.label { |
| white-space: nowrap } |
| |
| p.rubric { |
| font-weight: bold ; |
| font-size: larger ; |
| color: maroon ; |
| text-align: center } |
| |
| p.sidebar-title { |
| font-family: sans-serif ; |
| font-weight: bold ; |
| font-size: larger } |
| |
| p.sidebar-subtitle { |
| font-family: sans-serif ; |
| font-weight: bold } |
| |
| p.topic-title { |
| font-weight: bold } |
| |
| pre.address { |
| margin-bottom: 0 ; |
| margin-top: 0 ; |
| font-family: serif ; |
| font-size: 100% } |
| |
| pre.line-block { |
| font-family: serif ; |
| font-size: 100% } |
| |
| pre.literal-block, pre.doctest-block { |
| margin-left: 2em ; |
| margin-right: 2em ; |
| background-color: #eeeeee } |
| |
| span.classifier { |
| font-family: sans-serif ; |
| font-style: oblique } |
| |
| span.classifier-delimiter { |
| font-family: sans-serif ; |
| font-weight: bold } |
| |
| span.interpreted { |
| font-family: sans-serif } |
| |
| span.option { |
| white-space: nowrap } |
| |
| span.pre { |
| white-space: pre } |
| |
| span.problematic { |
| color: red } |
| |
| span.section-subtitle { |
| /* font-size relative to parent (h1..h6 element) */ |
| font-size: 80% } |
| |
| table.citation { |
| border-left: solid thin gray } |
| |
| table.docinfo { |
| margin: 2em 4em } |
| |
| table.docutils { |
| margin-top: 0.5em ; |
| margin-bottom: 0.5em } |
| |
| table.footnote { |
| border-left: solid thin black } |
| |
| table.docutils td, table.docutils th, |
| table.docinfo td, table.docinfo th { |
| padding-left: 0.5em ; |
| padding-right: 0.5em ; |
| vertical-align: top } |
| |
| table.docutils th.field-name, table.docinfo th.docinfo-name { |
| font-weight: bold ; |
| text-align: left ; |
| white-space: nowrap ; |
| padding-left: 0 } |
| |
| h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, |
| h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { |
| font-size: 100% } |
| |
| tt.docutils { |
| background-color: #eeeeee } |
| |
| ul.auto-toc { |
| list-style-type: none } |
| |
| </style> |
| </head> |
| <body> |
| <div class="document" id="boost-pointer-container-library"> |
| <h1 class="title"><img alt="Boost" src="boost.png" /> Pointer Container Library</h1> |
| <table class="docinfo" frame="void" rules="none"> |
| <col class="docinfo-name" /> |
| <col class="docinfo-content" /> |
| <tbody valign="top"> |
| <tr><th class="docinfo-name">Author:</th> |
| <td>Thorsten Ottosen</td></tr> |
| <tr><th class="docinfo-name">Contact:</th> |
| <td><a class="first reference" href="mailto:nesotto@cs.aau.dk">nesotto@cs.aau.dk</a> or <a class="last reference" href="mailto:tottosen@dezide.com">tottosen@dezide.com</a></td></tr> |
| <tr class="field"><th class="docinfo-name">Organizations:</th><td class="field-body"><a class="reference" href="http://www.cs.aau.dk">Department of Computer Science</a>, Aalborg University, and <a class="reference" href="http://www.dezide.com">Dezide Aps</a></td> |
| </tr> |
| <tr><th class="docinfo-name">Date:</th> |
| <td>27th of October 2007</td></tr> |
| <tr><th class="docinfo-name">Copyright:</th> |
| <td>Thorsten Ottosen 2004-2007. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see <a class="reference" href="http://www.boost.org/LICENSE_1_0.txt">LICENSE_1_0.txt</a>).</td></tr> |
| </tbody> |
| </table> |
| <div class="section"> |
| <h1><a id="overview" name="overview">Overview</a></h1> |
| <p>Boost.Pointer Container provides containers for holding heap-allocated |
| objects in an exception-safe manner and with minimal overhead. |
| The aim of the library is in particular to make OO programming |
| easier in C++ by establishing a standard set of classes, methods |
| and designs for dealing with OO specific problems</p> |
| <ul class="simple"> |
| <li><a class="reference" href="#motivation">Motivation</a></li> |
| <li><a class="reference" href="tutorial.html">Tutorial</a></li> |
| <li><a class="reference" href="reference.html">Reference</a></li> |
| <li><a class="reference" href="guidelines.html">Usage guidelines</a></li> |
| <li><a class="reference" href="examples.html">Examples</a></li> |
| <li><a class="reference" href="headers.html">Library headers</a></li> |
| <li><a class="reference" href="faq.html">FAQ</a></li> |
| <li><a class="reference" href="#upgrading-from-boost-v-1-33">Upgrading from Boost v. 1.33.*</a></li> |
| <li><a class="reference" href="#upgrading-from-boost-v-1-34">Upgrading from Boost v. 1.34.*</a></li> |
| <li><a class="reference" href="#upgrading-from-boost-v-1-35">Upgrading from Boost v. 1.35.*</a></li> |
| <li><a class="reference" href="#future-developments">Future Developments</a></li> |
| <li><a class="reference" href="#acknowledgements">Acknowledgements</a></li> |
| <li><a class="reference" href="#references">References</a></li> |
| </ul> |
| <!-- - `Conventions <conventions.html>`_ |
| - `The Clonable Concept <reference.html#the-clonable-concept>`_ |
| - `The Clone Allocator Concept <reference.html#the-clone-allocator-concept>`_ |
| - `Pointer container adapters <reference.html#pointer-container-adapters>`_ |
| - `Sequence container classes <reference.html#sequence-containers>`_ |
| |
| - `ptr_vector <ptr_vector.html>`_ |
| - `ptr_deque <ptr_deque.html>`_ |
| - `ptr_list <ptr_list.html>`_ |
| - `ptr_array <ptr_array.html>`_ |
| - `Associative container classes <reference.html#associative-containers>`_ |
| |
| - `ptr_set <ptr_set.html>`_ |
| - `ptr_multiset <ptr_multiset.html>`_ |
| - `ptr_map <ptr_map.html>`_ |
| - `ptr_multimap <ptr_multimap.html>`_ |
| - `Indirected functions <indirect_fun.html>`_ |
| - `Class nullable <reference.html#class-nullable>`_ |
| - `Exception classes <reference.html#exception-classes>`_ --> |
| </div> |
| <div class="section"> |
| <h1><a id="motivation" name="motivation">Motivation</a></h1> |
| <p>Whenever a programmer wants to have a container of pointers to |
| heap-allocated objects, there is usually only one exception-safe way: |
| to make a container of smart pointers like <a class="reference" href="../../smart_ptr/shared_ptr.htm">boost::shared_ptr</a> |
| This approach is suboptimal if</p> |
| <ol class="arabic simple"> |
| <li>the stored objects are not shared, but owned exclusively, or</li> |
| </ol> |
| <!-- --> |
| <ol class="arabic simple" start="2"> |
| <li>the overhead implied by smart pointers is inappropriate</li> |
| </ol> |
| <p>This library therefore provides standard-like containers that are for storing |
| heap-allocated or <a class="reference" href="reference.html#the-clonable-concept">cloned</a> objects (or in case of a map, the mapped object must be |
| a heap-allocated or cloned object). For each of the standard |
| containers there is a pointer container equivalent that takes ownership of |
| the objects in an exception safe manner. In this respect the library is intended |
| to solve the so-called |
| <a class="reference" href="faq.html#what-is-the-polymorphic-class-problem">polymorphic class problem</a>.</p> |
| <p>The advantages of pointer containers are</p> |
| <ol class="arabic simple"> |
| <li>Exception-safe pointer storage and manipulation.</li> |
| </ol> |
| <!-- --> |
| <ol class="arabic simple" start="2"> |
| <li>Notational convenience compared to the use of containers of pointers.</li> |
| </ol> |
| <!-- --> |
| <ol class="arabic simple" start="3"> |
| <li>Can be used for types that are neither Assignable nor Copy Constructible.</li> |
| </ol> |
| <!-- --> |
| <ol class="arabic simple" start="4"> |
| <li>No memory-overhead as containers of smart pointers can have (see <a class="footnote-reference" href="#id23" id="id2" name="id2">[11]</a> and <a class="footnote-reference" href="#id25" id="id3" name="id3">[12]</a>).</li> |
| </ol> |
| <!-- --> |
| <ol class="arabic simple" start="5"> |
| <li>Usually faster than using containers of smart pointers (see <a class="footnote-reference" href="#id23" id="id4" name="id4">[11]</a> and <a class="footnote-reference" href="#id25" id="id5" name="id5">[12]</a>).</li> |
| </ol> |
| <!-- --> |
| <ol class="arabic simple" start="6"> |
| <li>The interface is slightly changed towards the domain of pointers |
| instead of relying on the normal value-based interface. For example, |
| now it is possible for <tt class="docutils literal"><span class="pre">pop_back()</span></tt> to return the removed element.</li> |
| </ol> |
| <!-- --> |
| <ol class="arabic simple" start="7"> |
| <li>Propagates constness such that one cannot modify the objects via a <tt class="docutils literal"><span class="pre">const_iterator</span></tt>.</li> |
| </ol> |
| <!-- --> |
| <ol class="arabic simple" start="8"> |
| <li>Built-in support for deep-copy semantics via the <a class="reference" href="reference.html#the-clonable-concept">the Clonable concept</a></li> |
| </ol> |
| <p>The disadvantages are</p> |
| <ol class="arabic simple"> |
| <li>Less flexible than containers of smart pointers like <a class="reference" href="../../smart_ptr/shared_ptr.htm">boost::shared_ptr</a></li> |
| </ol> |
| <p>When you do need shared semantics, this library is not what you need.</p> |
| </div> |
| <div class="section"> |
| <h1><a id="upgrading-from-boost-v-1-33" name="upgrading-from-boost-v-1-33">Upgrading from Boost v. <tt class="docutils literal"><span class="pre">1.33.*</span></tt></a></h1> |
| <p>If you upgrade from one of these versions of Boost, then there has been one |
| major interface change: map iterators now mimic iterators from <tt class="docutils literal"><span class="pre">std::map</span></tt>. |
| Previously you may have written</p> |
| <pre class="literal-block"> |
| for( boost::ptr_map<std::string,T>::iterator i = m.begin(), e = m.end(); |
| i != e; ++i ) |
| { |
| std::cout << "key:" << i.key(); |
| std::cout << "value:" << *i; |
| i->foo(); // call T::foo() |
| } |
| </pre> |
| <p>and this now needs to be converted into</p> |
| <pre class="literal-block"> |
| for( boost::ptr_map<std::string,T>::iterator i = m.begin(), e = m.end(); |
| i != e; ++i ) |
| { |
| std::cout << "key:" << i->first; |
| std::cout << "value:" << *i->second; |
| i->second->foo(); // call T::foo() |
| } |
| </pre> |
| <p>Apart from the above change, the library now also introduces</p> |
| <ul> |
| <li><p class="first"><tt class="docutils literal"><span class="pre">std::auto_ptr<T></span></tt> overloads:</p> |
| <pre class="literal-block"> |
| std::auto_ptr<T> p( new T ); |
| container.push_back( p ); |
| </pre> |
| </li> |
| <li><p class="first">Derived-to-Base conversion in <tt class="docutils literal"><span class="pre">transfer()</span></tt>:</p> |
| <pre class="literal-block"> |
| boost::ptr_vector<Base> vec; |
| boost::ptr_list<Derived> list; |
| ... |
| vec.transfer( vec.begin(), list ); // now ok |
| </pre> |
| </li> |
| </ul> |
| <p>Also note that <a class="reference" href="../../assign/index.html">Boost.Assign</a> introduces better support |
| for pointer containers.</p> |
| </div> |
| <div class="section"> |
| <h1><a id="upgrading-from-boost-v-1-34" name="upgrading-from-boost-v-1-34">Upgrading from Boost v. <tt class="docutils literal"><span class="pre">1.34.*</span></tt></a></h1> |
| <p>Serialization has now been made optional thanks to Sebastian Ramacher. |
| You simply include <tt class="docutils literal"><span class="pre"><boost/ptr_container/serialize.hpp></span></tt> or perhaps |
| just one of the more specialized headers.</p> |
| <p>All containers are now copy-constructible and assignable. So you can e.g. now |
| do:</p> |
| <pre class="literal-block"> |
| boost::ptr_vector<Derived> derived = ...; |
| boost::ptr_vector<Base> base( derived ); |
| base = derived; |
| </pre> |
| <p>As the example shows, derived-to-base class conversions are also allowed.</p> |
| <p>A few general functions have been added:</p> |
| <pre class="literal-block"> |
| VoidPtrContainer& base(); |
| const VoidPtrContainer& base() const; |
| </pre> |
| <p>These allow direct access to the wrapped container which is |
| sometimes needed when you want to provide extra functionality.</p> |
| <p>A few new functions have been added to sequences:</p> |
| <pre class="literal-block"> |
| void resize( size_type size ); |
| void resize( size_type size, T* to_clone ); |
| </pre> |
| <p><tt class="docutils literal"><span class="pre">ptr_vector<T></span></tt> has a few new helper functions to integrate better with C-arrays:</p> |
| <pre class="literal-block"> |
| void transfer( iterator before, T** from, size_type size, bool delete_from = true ); |
| T** c_array(); |
| </pre> |
| <p>Finally, you can now also "copy" and "assign" an <tt class="docutils literal"><span class="pre">auto_type</span></tt> ptr by calling <tt class="docutils literal"><span class="pre">move()</span></tt>:</p> |
| <pre class="literal-block"> |
| boost::ptr_vector<T>::auto_type move_ptr = ...; |
| return boost::ptr_container::move( move_ptr ); |
| </pre> |
| </div> |
| <div class="section"> |
| <h1><a id="upgrading-from-boost-v-1-35" name="upgrading-from-boost-v-1-35">Upgrading from Boost v. <tt class="docutils literal"><span class="pre">1.35.*</span></tt></a></h1> |
| <p>The library has been fairly stable, but a few new containers have been supported:</p> |
| <ul class="simple"> |
| <li><tt class="docutils literal"><span class="pre">boost::ptr_unordered_set<T></span></tt> in <tt class="docutils literal"><span class="pre"><boost/ptr_container/ptr_unordered_set.hpp></span></tt></li> |
| <li><tt class="docutils literal"><span class="pre">boost::ptr_unordered_map<Key,T></span></tt> in <tt class="docutils literal"><span class="pre"><boost/ptr_container/ptr_unordered_map.hpp></span></tt></li> |
| <li><tt class="docutils literal"><span class="pre">boost::ptr_circular_buffer<T></span></tt> in <tt class="docutils literal"><span class="pre"><boost/ptr_container/ptr_circular_buffer.hpp></span></tt></li> |
| </ul> |
| <p>There are no docs for these classes yet, but they are almost identical to |
| <tt class="docutils literal"><span class="pre">boost::ptr_set<T></span></tt>, <tt class="docutils literal"><span class="pre">boost::ptr_map<Key,T></span></tt> and <tt class="docutils literal"><span class="pre">boost::ptr_array<T,N></span></tt>, respectively. |
| The underlying containers stem from the two boost libraries</p> |
| <ul class="simple"> |
| <li><a class="reference" href="../../unordered/index.html">Boost.Unordered</a></li> |
| <li><a class="reference" href="../../circular_buffer/index.html">Boost.Circular Buffer</a></li> |
| </ul> |
| <p>Furthermore, <a class="reference" href="ptr_inserter.html">insert iterators</a> have been added.</p> |
| </div> |
| <div class="section"> |
| <h1><a id="future-developments" name="future-developments">Future Developments</a></h1> |
| <p>There are indications that the <tt class="docutils literal"><span class="pre">void*</span></tt> implementation has a slight |
| performance overhead compared to a <tt class="docutils literal"><span class="pre">T*</span></tt> based implementation. Furthermore, a |
| <tt class="docutils literal"><span class="pre">T*</span></tt> based implementation is so much easier to use type-safely |
| with algorithms. Therefore I anticipate to move to a <tt class="docutils literal"><span class="pre">T*</span></tt> based implementation.</p> |
| <p>Furthermore, the clone allocator might be allowed to have state. |
| This design requires some thought, so if you have good ideas and use-cases' |
| for this, please don't hesitate to contact me.</p> |
| <p>Also, support for Boost.Interprocess is on the todo list.</p> |
| <p>There has been a few request for <tt class="docutils literal"><span class="pre">boost::ptr_multi_index_container<T,...></span></tt>. |
| I investigated how difficult it would be, and it did turn out to be difficult, albeit |
| not impossible. But I don't have the resources to implement this beast |
| for years to come, so if someone really needs this container, I suggest that they |
| talk with me in private about how it can be done.</p> |
| </div> |
| <div class="section"> |
| <h1><a id="acknowledgements" name="acknowledgements">Acknowledgements</a></h1> |
| <p>The following people have been very helpful:</p> |
| <ul class="simple"> |
| <li>Bjørn D. Rasmussen for unintentionally motivating me to start this library</li> |
| <li>Pavel Vozenilek for asking me to make the adapters</li> |
| <li>David Abrahams for the <tt class="docutils literal"><span class="pre">indirect_fun</span></tt> design</li> |
| <li>Pavol Droba for being review manager</li> |
| <li>Ross Boylan for trying out a prototype for real</li> |
| <li>Felipe Magno de Almeida for giving fedback based on using the |
| library in production code even before the library was part of boost</li> |
| <li>Jonathan Turkanis for supplying his <tt class="docutils literal"><span class="pre">move_ptr</span></tt> framework |
| which is used internally</li> |
| <li>Stefan Slapeta and Howard Hinnant for Metrowerks support</li> |
| <li>Russell Hind for help with Borland compatibility</li> |
| <li>Jonathan Wakely for his great help with GCC compatibility and bug fixes</li> |
| <li>Pavel Chikulaev for comments and bug-fixes</li> |
| <li>Andreas Hommel for fixing the nasty Metrowerks bug</li> |
| <li>Charles Brockman for his many comments on the documentation</li> |
| <li>Sebastian Ramacher for implementing the optional serialization support</li> |
| </ul> |
| </div> |
| <div class="section"> |
| <h1><a id="references" name="references">References</a></h1> |
| <table class="docutils footnote" frame="void" id="id8" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id8">[1]</a></td><td>Matt Austern: <a class="reference" href="http://www.cuj.com/documents/s=7990/cujcexp1910austern/">"The Standard Librarian: Containers of Pointers"</a> , C/C++ Users Journal Experts Forum.</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id10" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id10">[2]</a></td><td>Bjarne Stroustrup, "The C++ Programming Language", <a class="reference" href="http://www.research.att.com/~bs/3rd_safe.pdf">Appendix E: "Standard-Library Exception Safety"</a></td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id12" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id12">[3]</a></td><td>Herb Sutter, "Exceptional C++".</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id13" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id13">[4]</a></td><td>Herb Sutter, "More Exceptional C++".</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id14" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id14">[5]</a></td><td>Kevlin Henney: <a class="reference" href="http://www.cuj.com/documents/s=7986/cujcexp2002henney/henney.htm">"From Mechanism to Method: The Safe Stacking of Cats"</a> , C++ Experts Forum, February 2002.</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id16" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id16">[6]</a></td><td>Some of the few earlier attempts of pointer containers I have seen are the rather interesting <a class="reference" href="http://www.ntllib.org/asp.html">NTL</a> and the |
| <a class="reference" href="http://ootips.org/yonat/4dev/pointainer.h">pointainer</a>. |
| As of this writing both libraries are not exceptions-safe and can leak.</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id17" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id17">[7]</a></td><td>INTERNATIONAL STANDARD, Programming languages --- C++, ISO/IEC 14882, 1998. See section 23 in particular.</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id18" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id18">[8]</a></td><td>C++ Standard Library Closed Issues List (Revision 27), |
| Item 218, <a class="reference" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-closed.html#218">Algorithms do not use binary predicate objects for default comparisons</a>.</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id20" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id20">[9]</a></td><td>C++ Standard Library Active Issues List (Revision 27), |
| Item 226, <a class="reference" href="http://gcc.gnu.org/onlinedocs/libstdc++/ext/lwg-active.html#226">User supplied specializations or overloads of namespace std function templates</a>.</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id22" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id22">[10]</a></td><td>Harald Nowak, "A remove_if for vector", C/C++ Users Journal, July 2001.</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id23" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id23">[11]</a></td><td><em>(<a class="fn-backref" href="#id2">1</a>, <a class="fn-backref" href="#id4">2</a>)</em> Boost smart pointer <a class="reference" href="http://www.boost.org/libs/smart_ptr/smarttests.htm">timings</a></td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id25" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id25">[12]</a></td><td><em>(<a class="fn-backref" href="#id3">1</a>, <a class="fn-backref" href="#id5">2</a>)</em> <a class="reference" href="http://www.ntllib.org/asp.html">NTL</a>: Array vs std::vector and boost::shared_ptr</td></tr> |
| </tbody> |
| </table> |
| <table class="docutils footnote" frame="void" id="id26" rules="none"> |
| <colgroup><col class="label" /><col /></colgroup> |
| <tbody valign="top"> |
| <tr><td class="label"><a name="id26">[13]</a></td><td>Kevlin Henney, <a class="reference" href="http://www.two-sdg.demon.co.uk/curbralan/papers/europlop/NullObject.pdf">Null Object</a>, 2002.</td></tr> |
| </tbody> |
| </table> |
| <hr><table class="docutils field-list" frame="void" rules="none"> |
| <col class="field-name" /> |
| <col class="field-body" /> |
| <tbody valign="top"> |
| <tr class="field"><th class="field-name">Copyright:</th><td class="field-body">Thorsten Ottosen 2004-2006.</td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </body> |
| </html> |