<!--
    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-2008 Rogue Wave Software, Inc.
-->

<HTML>
<HEAD>
<TITLE>Table, Figure, and Examples List</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<IMG SRC="images/bnoprev.gif" WIDTH=20 HEIGHT=21 ALT="No previous file" BORDER=O><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><IMG SRC="images/bnonext.gif" WIDTH=25 HEIGHT=21 ALT="No next file" BORDER=O><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>

<H2>Table, Figure, and Example Listings</H2>
<P>This page lists tables, figures, and captioned example code in this document. If one of those listings does not appear, it is because there are no items of that type in the document.</P>
<P>Available listings:</P>
<UL>
<LI><A HREF="#tables">Tables</A></LI>
</UL>
<H3><A NAME="tables">Tables</A></H3>
<UL>
<A HREF="2-2.html#Table&nbsp;1">Table&nbsp;1: Language support library</A><BR>
<A HREF="2-3.html#Table&nbsp;2">Table&nbsp;2: Diagnostics library</A><BR>
<A HREF="2-4.html#Table&nbsp;3">Table&nbsp;3: General utilities library</A><BR>
<A HREF="2-5.html#Table&nbsp;4">Table&nbsp;4: Strings library</A><BR>
<A HREF="2-6.html#Table&nbsp;5">Table&nbsp;5: Localization library</A><BR>
<A HREF="2-7.html#Table&nbsp;6">Table&nbsp;6: Containers library</A><BR>
<A HREF="2-8.html#Table&nbsp;7">Table&nbsp;7: Iterators library</A><BR>
<A HREF="2-9.html#Table&nbsp;8">Table&nbsp;8: Algorithms library</A><BR>
<A HREF="2-10.html#Table&nbsp;9">Table&nbsp;9: Numerics library</A><BR>
<A HREF="2-11.html#Table&nbsp;10">Table&nbsp;10: Input/output library</A><BR>
<A HREF="basic-ostream.html#Table&nbsp;11">Table&nbsp;11: Formatting manipulators and functions for basic_ostream&nbsp;</A><BR>
<A HREF="char-traits.html#Table&nbsp;12">Table&nbsp;12: Default values for types</A><BR>
<A HREF="codecvt.html#Table&nbsp;13">Table&nbsp;13: Return values of do_out and do_in&nbsp;</A><BR>
<A HREF="codecvt.html#Table&nbsp;14">Table&nbsp;14: Return values of do_unshift</A><BR>
<A HREF="codecvt-byname.html#Table&nbsp;15">Table&nbsp;15: Supported common codesets</A><BR>
<A HREF="cout.html#Table&nbsp;16">Table&nbsp;16: Formatting functions and manipulators for cout</A><BR>
<A HREF="ctype.html#Table&nbsp;17">Table&nbsp;17: Ctype masks provided by ctype_base</A><BR>
<A HREF="facets.html#Table&nbsp;18">Table&nbsp;18: Categories and facets of the locale class</A><BR>
<A HREF="functionobjects.html#Table&nbsp;19">Table&nbsp;19: C++ Standard Library function objects and their operations</A><BR>
<A HREF="locale.html#Table&nbsp;20">Table&nbsp;20: Standard facet types&nbsp;</A><BR>
<A HREF="locale.html#Table&nbsp;21">Table&nbsp;21: Locale definition files&nbsp;</A><BR>
<A HREF="localeutility.html#Table&nbsp;22">Table&nbsp;22: locale utility option requirements of the IEEE Std. 1003.1-2001 (POSIX) standard&nbsp;</A><BR>
<A HREF="localeutility.html#Table&nbsp;23">Table&nbsp;23: locale utility option requirements of the IEEE Std. 1003.1-2001 (POSIX) standard&nbsp;</A><BR>
<A HREF="localeutility.html#Table&nbsp;24">Table&nbsp;24: locale utility exit status&nbsp;</A><BR>
<A HREF="localedefutility.html#Table&nbsp;25">Table&nbsp;25: localedef option requirements of the IEEE Std. 1003.1-2001 (POSIX) standard&nbsp;</A><BR>
<A HREF="localedefutility.html#Table&nbsp;26">Table&nbsp;26: localedef option extensions to the IEEE Std 1003.1-2001 (POSIX) standard&nbsp;</A><BR>
<A HREF="localedefutility.html#Table&nbsp;27">Table&nbsp;27: localedef exit status&nbsp;</A><BR>
<A HREF="moneypunct.html#Table&nbsp;28">Table&nbsp;28: Enumeration values of field indexes in the money_base pattern struct</A><BR>
<A HREF="num-put.html#Table&nbsp;29">Table&nbsp;29: ios_base::adjustfield formats&nbsp;</A><BR>
<A HREF="num-put.html#Table&nbsp;30">Table&nbsp;30: os_base::basefield formats&nbsp;</A><BR>
<A HREF="num-put.html#Table&nbsp;31">Table&nbsp;31: ios_base::floatfield formats</A><BR>
<A HREF="num-put.html#Table&nbsp;32">Table&nbsp;32: Legend for Table 1, Table 2 and Table 3</A><BR>
<A HREF="time-get.html#Table&nbsp;33">Table&nbsp;33: Possible values of the dateorder function of the time_base class&nbsp;</A><BR>
<A HREF="time-get.html#Table&nbsp;34">Table&nbsp;34: Recognized conversion specifiers&nbsp;</A><BR>
<A HREF="time-get.html#Table&nbsp;35">Table&nbsp;35: Recognized modified conversion specifiers&nbsp;</A><BR>
<A HREF="time-put.html#Table&nbsp;36">Table&nbsp;36: Recognized formatting characters. Struct tm members used to produce the format are noted [in brackets].&nbsp;</A><BR>
<A HREF="time-put.html#Table&nbsp;37">Table&nbsp;37: Recognized modified formatting characters&nbsp;.</A><BR>
<A HREF="wcout.html#Table&nbsp;38">Table&nbsp;38: Formatting functions and manipulators in wcout</A><BR>
<A HREF="B.html#Table&nbsp;39">Table&nbsp;39: Extensions of this implementation to the C++ Standard Library&nbsp;</A><BR>

<A HREF="basic-ios.html#Table&nbsp;40">Table&nbsp;40: <SAMP>copyfmt()</SAMP> Postconditions</A><BR>

<A HREF="basic-ios.html#Table&nbsp;41">Table&nbsp;41: <SAMP>init()</SAMP> Postconditions</A><BR>

</UL>


<BR>
<HR>
<IMG SRC="images/bnoprev.gif" WIDTH=20 HEIGHT=21 ALT="No previous file" BORDER=O><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><IMG SRC="images/bnonext.gif" WIDTH=20 HEIGHT=21 ALT="No next file" BORDER=O>

<!-- 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>
