Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.

Boost Pointer Container Library

Author: Thorsten Ottosen
Contact: nesotto@cs.aau.dk
organizations:Department of Computer Science, Aalborg University, and Dezide Aps
Date: 3rd of May 2005
Copyright: Thorsten Ottosen 2004-2005. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt).

Overview

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

Motivation

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 pointer pointers like boost::shared_ptr. This approach is suboptimal if

  1. the stored objects are not shared, but owned exclusively, or
  2. the overhead implied by pointer pointers is inappropriate

This library therefore provides standard-like containers that are for storing heap-allocated or cloned 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 polymorphic class problem.

The advantages of pointer containers are

  1. Exception-safe pointer storage and manipulation.
  2. Notational convenience compared to the use of containers of pointers.
  3. Can be used for types that are neither Assignable nor Copy Constructible.
  4. No memory-overhead as containers of pointer pointers can have (see [11] and [12]).
  5. Usually faster than using containers of pointer pointers (see [11] and [12]).
  6. 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 pop_back() to return the removed element.
  7. Propagates constness s.t. one cannot modify the objects via a const_iterator

The disadvantages are

  1. Less flexible than containers of smart pointers like boost::shared_ptr

Acknowledgements

The following people have been very helpful:

References

[1]Matt Austern: "The Standard Librarian: Containers of Pointers" , C/C++ Users Journal Experts Forum.
[2]Bjarne Stroustrup, "The C++ Programming Language", Appendix E: "Standard-Library Exception Safety"
[3]Herb Sutter, "Exceptional C++".
[4]Herb Sutter, "More Exceptional C++".
[5]Kevlin Henney: "From Mechanism to Method: The Safe Stacking of Cats" , C++ Experts Forum, February 2002.
[6]Some of the few earlier attempts of pointer containers I have seen are the rather interesting NTL and the pointainer. As of this writing both libraries are not exceptions-safe and can leak.
[7]INTERNATIONAL STANDARD, Programming languages --- C++, ISO/IEC 14882, 1998. See section 23 in particular.
[8]C++ Standard Library Closed Issues List (Revision 27), Item 218, Algorithms do not use binary predicate objects for default comparisons.
[9]C++ Standard Library Active Issues List (Revision 27), Item 226, User supplied specializations or overloads of namespace std function templates.
[10]Harald Nowak, "A remove_if for vector", C/C++ Users Journal, July 2001.
[11](1, 2) Boost smart pointer timings
[12](1, 2) NTL: Array vs std::vector and boost::shared_ptr
[13]Kevlin Henney, Null Object, 2002.
copyright:Thorsten Ottosen 2004-2005.