STL source code analysis --- stl_multiset.h Reading Notes, stl source code analysis notes
The set in STL does not allow repeated key values. Therefore, multiset is available. The multiset and set operations are the same and have the same functions, but the multiset allows duplicate key values. In the insert operation using the red/black tree, insert_equal is used, and set uses insert_unique, other codes are the same.
G ++ 2.91.57, cygnus \ cygwin-b20 \ include \ g ++ \ stl_multiset.h complete list/*** Copyright (c) 1994 * Hewlett-Packard Company ** Permission to use, copy, modify, distribute and modify this software * and its documentation for any purpose is hereby granted without handle, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in suppo Rting documentation. hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. it is provided "as is" without express or implied warranty. * ** Copyright (c) 1996 * Silicon Graphics Computer Systems, Inc. ** Permission to use, copy, modify, distribute and merge this software * and its documentation for any purpose is hereby granted without tables ,* Provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. silicon Graphics makes no * representations about the suitability of this software for any * purpose. it is provided "as is" without express or implied warranty. * // * NOTE: This is an internal header file, encoded ded by other STL header S. * You shoshould not attempt to use it directly. */# ifndef _ SGI_STL_INTERNAL_MULTISET_H # define _ EXIST # if defined (_ sgi )&&! Defined (_ GNUC _) & (_ MIPS_SIM! = _ MIPS_SIM_ABI32) # pragma set woff 1174 # endif # ifndef _ STL_LIMITED_DEFAULT_TEMPLATEStemplate <class Key, class Compare = less <Key>, class Alloc = alloc> # elsetemplate <class Key, class Compare, class Alloc = alloc> # endifclass multiset {public: // typedefs: typedef Key key_type; typedef Key value_type; typedef Compare key_compare; typedef Compare value_compare; private: typedef rb_tree <key_type, value _ Type, identity <value_type>, key_compare, Alloc> rep_type; rep_type t; // red-black tree representing multisetpublic: typedef typename rep_type: const_pointer pointer; typedef typename rep_type :: const_pointer; typedef typename rep_type: const_reference reference; typedef typename rep_type: const_reference; typedef typename rep_type: const_iterator iterator; typedef Pename rep_type: Required bytes; typedef typename rep_type: size_type; typedef typename rep_type: Required bytes; // allocation/deallocation // note that multiset must use insert_equal () instead of insert_unique (). // Set to use insert_unique (). Multiset (): t (Compare () {} explicit multiset (const Compare & comp): t (comp) {}# ifdef _ STL_MEMBER_TEMPLATES template <class InputIterator> multiset (InputIterator first, InputIterator last): t (Compare () {t. insert_equal (first, last);} template <class InputIterator> multiset (InputIterator first, InputIterator last, const Compare & comp): t (comp) {t. insert_equal (first, last) ;}# else multiset (co Nst value_type * first, const value_type * last): t (Compare () {t. insert_equal (first, last);} multiset (const value_type * first, const value_type * last, const Compare & comp): t (comp) {t. insert_equal (first, last);} multiset (const_iterator first, const_iterator last): t (Compare () {t. insert_equal (first, last);} multiset (const_iterator first, const_iterator last, const Compare & comp): t (comp) {T. insert_equal (first, last) ;}# endif/* _ STL_MEMBER_TEMPLATES */multiset (const multiset <Key, Compare, Alloc> & x): t (x. t) {} multiset <Key, Compare, Alloc> & operator = (const multiset <Key, Compare, Alloc> & x) {t = x. t; return * this;} // accessors: key_compare key_comp () const {return t. key_comp ();} value_compare value_comp () const {return t. key_comp ();} iterator begin () const {return t. beg In ();} iterator end () const {return t. end ();} reverse_iterator rbegin () const {return t. rbegin ();} reverse_iterator rend () const {return t. rend ();} bool empty () const {return t. empty ();} size_type size () const {return t. size ();} size_type max_size () const {return t. max_size ();} void swap (multiset <Key, Compare, Alloc> & x) {t. swap (x. t);} // insert/erase iterator insert (const value_typ E & x) {return t. insert_equal (x);} iterator insert (iterator position, const value_type & x) {typedef typename rep_type: iterator rep_iterator; return t. insert_equal (rep_iterator &) position, x) ;}# ifdef _ STL_MEMBER_TEMPLATES template <class InputIterator> void insert (InputIterator first, InputIterator last) {t. insert_equal (first, last) ;}# else void insert (const value_type * first, const value_typ E * last) {t. insert_equal (first, last);} void insert (const_iterator first, const_iterator last) {t. insert_equal (first, last) ;}# endif/* _ STL_MEMBER_TEMPLATES */void erase (iterator position) {typedef typename rep_type: iterator rep_iterator; t. erase (rep_iterator &) position);} size_type erase (const key_type & x) {return t. erase (x);} void erase (iterator first, iterator last) {typedef typenam E rep_type: iterator rep_iterator; t. erase (rep_iterator &) first, (rep_iterator &) last);} void clear () {t. clear ();} // multiset operations: iterator find (const key_type & x) const {return t. find (x);} size_type count (const key_type & x) const {return t. count (x);} iterator lower_bound (const key_type & x) const {return t. lower_bound (x);} iterator upper_bound (const key_type & x) const {return t. up Per_bound (x);} pair <iterator, iterator> pai_range (const key_type & x) const {return t. performance_range (x);} friend bool operator ==_ _ STL_NULL_TMPL_ARGS (const multiset &, const multiset &); friend bool operator <_ STL_NULL_TMPL_ARGS (const multiset &, const multiset &) ;}; template <class Key, class Compare, class Alloc> inline bool operator ==( const multiset <Key, Compare, Alloc> & x, const multiset <Key, Com Pare, Alloc> & y) {return x. t = y. t;} template <class Key, class Compare, class Alloc> inline bool operator <(const multiset <Key, Compare, Alloc> & x, const multiset <Key, Compare, alloc> & y) {return x. t <y. t ;}# ifdef _ STL_FUNCTION_TMPL_PARTIAL_ORDERtemplate <class Key, class Compare, class Alloc> inline void swap (multiset <Key, Compare, Alloc> & x, multiset <Key, Compare, alloc> & y) {x. swap (y) ;}# endif /* _ STL_FUNCTION_TMPL_PARTIAL_ORDER */# if defined (_ sgi )&&! Defined (_ GNUC _) & (_ MIPS_SIM! = _ MIPS_SIM_ABI32) # pragma reset woff 1174 # endif _ STL_END_NAMESPACE # endif/* _ SGI_STL_INTERNAL_MULTISET_H * // Local Variables: // mode: C ++/End:
I want to learn it first. I need a PDF copy of "STL source code analysis". Thank you!
Sent. Check. A simplified version and a traditional version. Traditional Chinese characters are clear and simplified Chinese characters are fuzzy, but there is no simplified Chinese clear version. It is recommended that you buy a copy of paper on the Internet, which is not very expensive. It looks better than the electronic version (personal opinion ^_^)
Which of the following is an entry point for generic programming and STL source code analysis?
It is recommended that you take a look at generic programming and STL to get started easily. In addition, it is recommended that you learn easy language programming. Easy language programming is a Chinese programming language, which is easy to learn.