The STL is a large and important part of the forthcoming C++ standard library. Of all the library sections, the STL bears least resemblance to the familiar facilities of the C library. It is also so powerful, flexible and useful that it can change your programming style and pervade all the code that you write. This set of files is an unsupported implementation of the STL. It was created at HP for use with the Borland compiler, and then ported to the Watcom 10 compiler. HP's Borland-compatible version of the STL is available from several sites on Compuserve and the Internet as STL.ZIP; Source & docs, about 250k Web site having the source & docs plus additional info Compuserve; Borland C++/DOS forum, library 6 While it was ported to Watcom, support for mixed-model programming was removed. A summary of the changes made is in the file WATCOM.PRT. There now follows the original HP README file. -------------------------------------------------------------------------------- NOTICE: (1) STL is the container, iterator, algorithm part of the C++ standard library, it is not the complete standard library. (I/O streams, strings, etc. are not included in this package.) (2) Minor changes to the STL is expected during the completion of the standard. (3) The allocator files (defalloc.h, faralloc.h, hugalloc.h, lngalloc.h and neralloc.h) in the package are sample files. They are not designed for any specific machine and compiler system. For example, the assumption that type size_t and type ptrdiff_t used in the default allocator are of the same size, it is not true with Borland compiler. Each compiler vendor has to supply their own allocation files to support the machine models they deal with. This release (dated February 7, 1995) is a bug fix release with noticeable changes in associative container implementation. A change note is attached at the end of this file. The postscript files of the document doc.ps and docbar.ps (with change bars from the previous version) should print on both US letter and A4 page sizes. The code difference from the previous version (December 6, 1994) is in file files.dif. ------------------------------------------------------------------------- --- by D. Musser (musser@cs.rpi.edu) Changes to the HP implementation of STL associative containers The purpose of these changes is to improve the performance of certain operations on STL associative containers. Empirical tests of the performance have been made in all cases and they mostly confirm that times are improved, although in one case (the find operation, see item 3) the tests are ambiguous and more testing should be done. The revisions to the internal class rb_tree affect the corresponding operations in all of the user-level associative classes (set, multiset, map, multimap). The files affected are tree.h, set.h, multiset.h, and projectn.h. 1. The copy constructor and operator= for class rb_tree are revised to use a private function __copy that does a structural copy rather than creating the new tree using insertions. This substantially speeds up copying and assignment since no comparisons or tree balancing need to be done. 2. The erase operation for rb_tree now checks for the case that the entire tree is being erased, and in that case does the erasure by a simple pre-order traversal of the tree. This speeds up erasure since there is no need for any of the tree balancing that happens when nodes are erased one by one. 3. The search operations, find, lower_bound, and upper_bound, in rb_tree have been revised. The find operation searches all the way down to a leaf node, using a single comparison at each level of the tree. Formerly it used two comparisons on each level at which the first comparison was false. The old algorithm was simple and would detect a match with fewer comparisons in some cases, because the match was detected at an interior node, but the average number of comparisons is lower with the revised algorithm. However the new algorithm has to climb back up in the tree and the overhead of doing so offsets some of the savings from doing fewer comparisons. The revised algorithm is now basically the same as is used (and was already used) in lower_bound and upper_bound. The algorithms for lower_bound and upper_bound have also been revised slightly, to eliminate one extra comparison they were doing. 4. The algorithm for insert(const value_type&) is similarly revised to search all the way down to a leaf node using a single comparison at each level; the old algorithm was similar to the old algorithm for find. The new algorithm is similar to that of upper_bound. Basing it on upper_bound rather than lower_bound results in a stability property when associative containers are used to sort (by starting with an empty container, inserting values, then traversing through the container with an iterator): items that compare equal keep the relative order in which they were inserted. 5. The set and multiset implementations are revised to eliminate the need to use singleton as their value_type. Using singleton worked correctly but had the performance drawback of an extra call to the copy constructor for type Key when creating a singleton value. In the new version the value type is just Key, and changes to Key via *i = ... are prevented by defining both iterator and const_iterator as the const_iterator type for the underlying red-black tree class. This requires a few type coercions, but actually fewer than when singleton was used. Thanks to Fabrice Clerc for pointing out the copy-constructor problem with singleton. (Mr. Clerc also points out that there is a related problem with map and multimap caused by using pair as value_type, but so far I don't see a way of avoiding the problem without changing the interface to include an insert operation with separate Key and Value arguments.)