<!--
    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 Reference Guide</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<H1>Apache C++ Standard Library Reference Guide</H1>
<P>Welcome to the <I>Apache C++ Standard Library Reference Guide</I>.</P>
<P>Here are several ways you can access the information in this document:</P>
<UL>
<LI>Hypertext lists showing the classes and other elements described in this document, arranged
<UL><LI><A HREF="booktoc.html">Alphabetically</A><BR>and</LI>
<LI><A HREF="functoc.html">Functionally</A></LI>
</UL>
</LI>
<LI>A <A HREF="tindex.html">Comprehensive Index of Class Members</A>, with links to the member functions and data types for all classes described in this document.</LI>
<LI>A <A HREF="lists.html">listing</A> of Tables, Figures, and Examples.</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>
<H4><A HREF="2.html">Chapter 2: Index of Libraries</A></H4>
<H3><A HREF="II.html">Part II: Reference</A></H3>
<H3><A HREF="III.html">Part III: Obsolete Classes Reference</A></H3>
<H3><A HREF="IV.html">Part IV: Appendixes</A></H3>
<H4><A HREF="A.html">Appendix A: Implementation Details</A></H4>
<H4><A HREF="B.html">Appendix B: Extensions to the C++ Standard</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>
