<!--
    Licensed to the Apache Software  Foundation (ASF) under one or more
    contributor  license agreements.  See  the NOTICE  file distributed
    with  this  work  for  additional information  regarding  copyright
    ownership.   The ASF  licenses this  file to  you under  the Apache
    License, Version  2.0 (the  License); you may  not use  this file
    except in  compliance with the License.   You may obtain  a copy of
    the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the  License is distributed on an  "AS IS" BASIS,
    WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
    implied.   See  the License  for  the  specific language  governing
    permissions and limitations under the License.

    Copyright 1999-2007 Rogue Wave Software, Inc.
-->

<HTML>
<HEAD>
<TITLE>Apache C++ Standard Library User's Guide</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<H1>Apache C++ Standard Library User's Guide</H1>
<P>Welcome to the <I>Apache C++ Standard Library User's Guide</I>.</P>
<P>Here are several ways you can access the information in this document:</P>
<UL>
<LI>A <A HREF="booktoc.html">Comprehensive Table of Contents</A> showing all chapters, first- and second-level headings.</LI>
<LI>Click on one of the chapter names below to go directly to that chapter. Each chapter begins with a chapter-level table of contents.</LI>
<LI>A <A HREF="lists.html">listing</A> of Tables, Figures, and Examples.</LI>
<LI>A <A HREF="tindex.html">topic index</A>.</LI>
</UL>
<H2>Main Sections</H2>
<UL>
<H3><A HREF="I.html">Part I: Introduction</A></H3>
<H4><A HREF="1.html">Chapter 1: Overview</A></H4>
<H3><A HREF="II.html">Part II: Fundamentals</A></H3>
<H4><A HREF="2.html">Chapter 2: Iterators</A></H4>
<H4><A HREF="3.html">Chapter 3: Functions and Predicates</A></H4>
<H3><A HREF="III.html">Part III: Containers</A></H3>
<H4><A HREF="4.html">Chapter 4: Container Classes</A></H4>
<H4><A HREF="5.html">Chapter 5: vector and vector&lt;bool&gt;</A></H4>
<H4><A HREF="6.html">Chapter 6: list</A></H4>
<H4><A HREF="7.html">Chapter 7: deque</A></H4>
<H4><A HREF="8.html">Chapter 8: set, multiset, and bitset</A></H4>
<H4><A HREF="9.html">Chapter 9: map and multimap</A></H4>
<H4><A HREF="10.html">Chapter 10: The Container Adaptors  stack and queue</A></H4>
<H4><A HREF="11.html">Chapter 11: The Container Adaptor priority queue</A></H4>
<H4><A HREF="12.html">Chapter 12: string</A></H4>
<H3><A HREF="IV.html">Part IV: Algorithms</A></H3>
<H4><A HREF="13.html">Chapter 13: Generic Algorithms</A></H4>
<H4><A HREF="14.html">Chapter 14: Ordered Collection  Algorithms</A></H4>
<H3><A HREF="V.html">Part V: Special Techniques</A></H3>
<H4><A HREF="15.html">Chapter 15: Using Allocators</A></H4>
<H4><A HREF="16.html">Chapter 16: Building Containers and Algorithms</A></H4>
<H4><A HREF="17.html">Chapter 17: The Traits Parameter</A></H4>
<H4><A HREF="18.html">Chapter 18: Exception Handling</A></H4>
<H3><A HREF="VI.html">Part VI: Special Classes</A></H3>
<H4><A HREF="19.html">Chapter 19: auto_ptr</A></H4>
<H4><A HREF="20.html">Chapter 20: complex</A></H4>
<H4><A HREF="21.html">Chapter 21: numeric_limits</A></H4>
<H4><A HREF="22.html">Chapter 22: valarray</A></H4>
<H3><A HREF="VII.html">Part VII: Locales</A></H3>
<H4><A HREF="23.html">Chapter 23: Internationalization and Localization</A></H4>
<H4><A HREF="24.html">Chapter 24: The C and C++ Locales</A></H4>
<H4><A HREF="25.html">Chapter 25: Facets</A></H4>
<H4><A HREF="26.html">Chapter 26: Building Your Own Facet Class</A></H4>
<H3><A HREF="VIII.html">Part VIII: Iostreams</A></H3>
<H4><A HREF="27.html">Chapter 27: The Architecture of Iostreams</A></H4>
<H4><A HREF="28.html">Chapter 28: Formatted Input and Output</A></H4>
<H4><A HREF="29.html">Chapter 29: Error State of Streams</A></H4>
<H4><A HREF="30.html">Chapter 30: File Input and Output</A></H4>
<H4><A HREF="31.html">Chapter 31: Input and Output In Memory</A></H4>
<H4><A HREF="32.html">Chapter 32: Input and Output of User Types</A></H4>
<H4><A HREF="33.html">Chapter 33: Manipulators</A></H4>
<H4><A HREF="34.html">Chapter 34: Streams and Stream Buffers</A></H4>
<H4><A HREF="35.html">Chapter 35: Synchronizing Streams</A></H4>
<H4><A HREF="36.html">Chapter 36: Stream Storage for Private Use</A></H4>
<H4><A HREF="37.html">Chapter 37: Registration of Callback Functions</A></H4>
<H4><A HREF="38.html">Chapter 38: Creating New Stream Classes by Derivation</A></H4>
<H4><A HREF="39.html">Chapter 39: Stream Buffers</A></H4>
<H4><A HREF="40.html">Chapter 40: Defining A Code Conversion Facet</A></H4>
<H4><A HREF="41.html">Chapter 41: Defining Your Own Character Types</A></H4>
<H4><A HREF="42.html">Chapter 42: Imbuing Locales</A></H4>
<H4><A HREF="43.html">Chapter 43: Stream Iterators</A></H4>
<H4><A HREF="44.html">Chapter 44: Iostreams and Multithreading</A></H4>
<H4><A HREF="45.html">Chapter 45: Standard vs. Traditional Iostreams</A></H4>
<H4><A HREF="46.html">Chapter 46: Standard vs. Apache C++ Standard Library Iostreams</A></H4>
</UL>


<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
    _uacct = "UA-1775151-1";
    urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->

</BODY>
</HTML>
