⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptr_container.rst

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 RST
字号:
++++++++++++++++++++++++++++++++++ |Boost| Pointer Container Library++++++++++++++++++++++++++++++++++.. |Boost| image:: boost.png:Authors:       Thorsten Ottosen:Contact:       nesotto@cs.aau.dk or tottosen@dezide.com:Organizations: `Department of Computer Science`_, Aalborg University, and `Dezide Aps`_:date:          27th of October 2007:Copyright:     Thorsten Ottosen 2004-2007. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt__).__ http://www.boost.org/LICENSE_1_0.txt.. _`Department of Computer Science`: http://www.cs.aau.dk.. _`Dezide Aps`: http://www.dezide.com========Overview========Boost.Pointer Container provides containers for holding heap-allocatedobjects in an exception-safe manner and with minimal overhead.The aim of the library is in particular to make OO programmingeasier in C++ by establishing a standard set of classes, methodsand designs for dealing with OO specific problems* Motivation_* Tutorial_* Reference_* `Usage guidelines`_* Examples_* `Library headers`_* FAQ_* `Upgrading from Boost v. 1.33.*`_* `Upgrading from Boost v. 1.34.*`_* `Upgrading from Boost v. 1.35.*`_* `Future Developments`_* Acknowledgements_* References_..          - `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>`_          .. _Tutorial: tutorial.html.. _Reference: reference.html.. _`Usage guidelines`: guidelines.html.. _Examples: examples.html.. _`Library headers`: headers.html.. _FAQ: faq.html==========Motivation==========Whenever a programmer wants to have a container of pointers toheap-allocated objects, there is usually only one exception-safe way:to make a container of smart pointers like `boost::shared_ptr <../../smart_ptr/shared_ptr.htm>`_This approach is suboptimal if1. the stored objects are not shared, but owned exclusively, or..2. the overhead implied by smart pointers is inappropriateThis library therefore provides standard-like containers that are for storingheap-allocated or `cloned <reference.html#the-clonable-concept>`_ objects (or in case of a map, the mapped object must bea heap-allocated or cloned object). For each of the standardcontainers there is a pointer container equivalent that takes ownership ofthe objects in an exception safe manner.  In this respect the library is intendedto solve the so-called`polymorphic class problem <faq.html#what-is-the-polymorphic-class-problem>`_.The advantages of pointer containers are1. 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 smart pointers can have (see [11]_ and [12]_)...5. Usually faster than using containers of smart 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 such that one cannot modify the objects via a ``const_iterator``...8. Built-in support for deep-copy semantics via the `the Clonable concept`__.. __: reference.html#the-clonable-conceptThe disadvantages are1. Less flexible than containers of smart pointers like `boost::shared_ptr <../../smart_ptr/shared_ptr.htm>`_When you do need shared semantics, this library is not what you need.==================================== Upgrading from Boost v. ``1.33.*``====================================If you upgrade from one of these versions of Boost, then there has been onemajor interface change: map iterators now mimic iterators from ``std::map``.Previously you may have written ::  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()  }  and this now needs to be converted into ::         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()  }Apart from the above change, the library now also introduces- ``std::auto_ptr<T>`` overloads::        std::auto_ptr<T> p( new T );        container.push_back( p );- Derived-to-Base conversion in ``transfer()``::        boost::ptr_vector<Base>  vec;        boost::ptr_list<Derived> list;        ...        vec.transfer( vec.begin(), list ); // now okAlso note that `Boost.Assign <../../assign/index.html>`_ introduces better supportfor pointer containers. ==================================== Upgrading from Boost v. ``1.34.*``====================================Serialization has now been made optional thanks to Sebastian Ramacher.You simply include ``<boost/ptr_container/serialize.hpp>`` or perhapsjust one of the more specialized headers.All containers are now copy-constructible and assignable. So you can e.g. nowdo::     boost::ptr_vector<Derived> derived = ...;    boost::ptr_vector<Base>    base( derived );    base = derived;    As the example shows, derived-to-base class conversions are also allowed. A few general functions have been added::    VoidPtrContainer&       base();    const VoidPtrContainer& base() const;These allow direct access to the wrapped container which issometimes needed when you want to provide extra functionality.    A few new functions have been added to sequences::    void resize( size_type size );    void resize( size_type size, T* to_clone );``ptr_vector<T>`` has a few new helper functions to integrate better with C-arrays::    void transfer( iterator before, T** from, size_type size, bool delete_from = true );    T**  c_array();Finally, you can now also "copy" and "assign" an ``auto_type`` ptr by calling ``move()``::    boost::ptr_vector<T>::auto_type move_ptr = ...;    return boost::ptr_container::move( move_ptr );==================================== Upgrading from Boost v. ``1.35.*``====================================The library has been fairly stable, but a few new containers have been supported:-  ``boost::ptr_unordered_set<T>`` in ``<boost/ptr_container/ptr_unordered_set.hpp>``-  ``boost::ptr_unordered_map<Key,T>`` in ``<boost/ptr_container/ptr_unordered_map.hpp>``-  ``boost::ptr_circular_buffer<T>`` in ``<boost/ptr_container/ptr_circular_buffer.hpp>``There are no docs for these classes yet, but they are almost identical to``boost::ptr_set<T>``, ``boost::ptr_map<Key,T>`` and ``boost::ptr_array<T,N>``, respectively.The underlying containers stem from the two boost libraries- `Boost.Unordered <../../unordered/index.html>`_ - `Boost.Circular Buffer <../../circular_buffer/index.html>`_Furthermore, `insert iterators <ptr_inserter.html>`_ have been added. ===================== Future Developments=====================There are indications that the ``void*`` implementation has a slightperformance overhead compared to a ``T*`` based implementation. Furthermore, a ``T*`` based implementation is so much easier to use type-safely with algorithms. Therefore I anticipate to move to a ``T*`` based implementation.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.Also, support for Boost.Interprocess is on the todo list.There has been a few request for ``boost::ptr_multi_index_container<T,...>``. I investigated how difficult it would be, and it did turn out to be difficult, albeitnot 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 theytalk with me in private about how it can be done.================Acknowledgements================The following people have been very helpful:- Bj鴕n D. Rasmussen for unintentionally motivating me to start this library- Pavel Vozenilek for asking me to make the adapters- David Abrahams for the ``indirect_fun`` design- Pavol Droba for being review manager- Ross Boylan for trying out a prototype for real- Felipe Magno de Almeida for giving fedback based on using the  library in production code even before the library was part of boost- Jonathan Turkanis for supplying his ``move_ptr`` framework  which is used internally- Stefan Slapeta and Howard Hinnant for Metrowerks support- Russell Hind for help with Borland compatibility- Jonathan Wakely for his great help with GCC compatibility and bug fixes- Pavel Chikulaev for comments and bug-fixes- Andreas Hommel for fixing the nasty Metrowerks bug- Charles Brockman for his many comments on the documentation- Sebastian Ramacher for implementing the optional serialization support==========References==========.. [1] Matt Austern: `"The Standard Librarian: Containers of Pointers"`__ , C/C++ Users Journal Experts Forum.__ http://www.cuj.com/documents/s=7990/cujcexp1910austern/.. [2] Bjarne Stroustrup, "The C++ Programming Language", `Appendix E: "Standard-Library Exception Safety"`____ http://www.research.att.com/~bs/3rd_safe.pdf.. [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.__ http://www.cuj.com/documents/s=7986/cujcexp2002henney/henney.htm.. [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`__.__ http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-closed.html#218        .. [9] C++ Standard Library Active Issues List (Revision 27),        Item 226, `User supplied specializations or overloads of namespace std function templates`__. __ http://gcc.gnu.org/onlinedocs/libstdc++/ext/lwg-active.html#226.. [10] Harald Nowak, "A remove_if for vector", C/C++ Users Journal, July 2001... [11] Boost smart pointer timings____ http://www.boost.org/libs/smart_ptr/smarttests.htm .. [12] NTL_: Array vs std::vector and boost::shared_ptr .. [13] Kevlin Henney, `Null Object`__, 2002.__ http://www.two-sdg.demon.co.uk/curbralan/papers/europlop/NullObject.pdf.. _NTL: http://www.ntllib.org/asp.html.. _pointainer: http://ootips.org/yonat/4dev/pointainer.h .. raw:: html         <hr>:Copyright: Thorsten Ottosen 2004-2006. 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -