<!--
    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>reverse_iterator</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="reverse-copy.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><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><A HREF="rotate.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>reverse_iterator</H2>
<P><B>Library:</B>&nbsp;&nbsp;<A HREF="2-8.html">Iterators</A></P>

<PRE><HR><B><I>Does not inherit</I></B><HR></PRE>

<UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Synopsis</A></LI>
<LI><A HREF="#sec4">Description</A></LI>
<LI><A HREF="#sec5">Interface</A></LI>
<LI><A HREF="#sec6">Example</A></LI>
<LI><A HREF="#sec7">Complexity</A></LI>
<LI><A HREF="#sec8">See Also</A></LI>
<LI><A HREF="#sec9">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
No Entries
<A NAME="sec2"><H3>Summary</H3></A>
<P>An iterator adaptor that traverses a collection backwards.</P>
<A NAME="sec3"><H3>Synopsis</H3></A>

<PRE>#include &lt;iterator&gt;

namespace std {
  template &lt;class Iterator&gt;
  class <B>reverse_iterator</B>;
}
</PRE>
<A NAME="sec4"><H3>Description</H3></A>
<P>The class template <B><I>reverse_iterator</I></B> adapts any random access iterator or <B><I>bidirectional_iterator</I></B> to facilitate the traversal of collections in the opposite direction. The fundamental relationship between a reverse iterator and its corresponding iterator <SAMP>i</SAMP> is established by the identity:</P>

<UL><PRE>        
&amp;*(reverse_iterator(i)) == &amp;*(i - 1);
</PRE></UL>
<P>This mapping is necessary because, while an iterator past the end of a sequence is still valid but not dereferenceable, there might not be a valid iterator before its beginning.</P>
<A NAME="sec5"><H3>Interface</H3></A>

<UL><PRE>namespace std {

  template &lt;class Iterator&gt;
  class reverse_iterator
    : public iterator
       &lt;typename iterator_traits&lt;iterator&gt;::iterator_category,
       &lt;typename iterator_traits&lt;iterator&gt;::value_type,
       &lt;typename iterator_traits&lt;iterator&gt;::difference_type,
       &lt;typename iterator_traits&lt;iterator&gt;::pointer,
       &lt;typename iterator_traits&lt;iterator&gt;::reference&gt;
  {

    public:
      typedef Iterator iterator_type;

      reverse_iterator();
      explicit reverse_iterator(iterator_type);

      iterator_type base();

      reference operator*();

      reverse_iterator&amp; operator++();
      reverse_iterator  operator++(int);
      reverse_iterator&amp; operator--();
      reverse_iterator  operator--(int);

      reverse_iterator  operator+  (difference_type) const;
      reverse_iterator&amp; operator+= (difference_type);
      reverse_iterator operator-   (difference_type) const;
      reverse_iterator&amp; operator-= (difference_type);

      reference operator[] (difference_type) const;
  };

  // Nonmember Operators

  template &lt;class Iterator&gt; 
  bool operator== (const reverse_iterator&lt;Iterator&gt;&amp;,
                   const reverse_iterator&lt;Iterator&gt;&amp;);

  template &lt;class Iterator&gt; 
  bool operator!= (const reverse_iterator&lt;Iterator&gt;&amp;,
                   const reverse_iterator&lt;Iterator&gt;&amp;);

  template &lt;class Iterator&gt; 
  bool operator&lt; (const reverse_iterator&lt;Iterator&gt;&amp;,
                  const reverse_iterator&lt;Iterator&gt;&amp;);

  template &lt;class Iterator&gt; 
  bool operator&gt; (const reverse_iterator&lt;Iterator&gt;&amp;,
                  const reverse_iterator&lt;Iterator&gt;&amp;);

  template &lt;class Iterator&gt; 
  bool operator&lt;= (const reverse_iterator&lt;Iterator&gt;&amp;,
                   const reverse_iterator&lt;Iterator&gt;&amp;);

  template &lt;class Iterator&gt; 
  bool operator&gt;= (const reverse_iterator&lt;Iterator&gt;&amp;,
                   const reverse_iterator&lt;Iterator&gt;&amp;);

  template &lt;class Iterator&gt; 
  typename reverse_iterator&lt;Iterator&gt;::difference_type
  operator- (const reverse_iterator&lt;Iterator&gt;&amp;,
             const reverse_iterator&lt;Iterator&gt;&amp;);

  template &lt;class Iterator&gt; 
  reverse_iterator&lt;Iterator&gt;
  operator+ (
      typename reverse_iterator&lt;Iterator&gt;::difference_type,
      const reverse_iterator&lt;Iterator&gt;&amp;);
}
</PRE></UL>
<A NAME="sec6"><H3>Example</H3></A>

<UL><PRE>//
//  rev_itr.cpp
//

#include &lt;iostream&gt;   // for cout, endl
#include &lt;vector&gt;     // for vector


int main ()
{
    typedef std::vector&lt;int, std::allocator&lt;int&gt; &gt; Vector;

    // Initialize a vector using an array.
    const Vector::value_type arr[] = { 3, 4, 7, 8 };
    const Vector v (arr + 0, arr + sizeof arr / sizeof *arr);

    // Output the original vector.
    std::cout &lt;&lt; "Traversing vector with iterator: \n     ";
    for (Vector::const_iterator i = v.begin (); 
         i != v.end (); ++i)
        std::cout &lt;&lt; *i &lt;&lt; " ";

    // Output the vector backwards.
    std::cout &lt;&lt; "\n\nSame vector, same loop, "
              &lt;&lt; "reverse_iterator: \n     ";
    for (Vector::const_reverse_iterator j (v.end ());
         j != Vector::const_reverse_iterator (v.begin ());
         ++j)
        std::cout &lt;&lt; *j &lt;&lt; " ";

    std::cout &lt;&lt; std::endl;

    return 0;
}


Program Output:
</PRE></UL>
<UL><PRE>Traversing vector with iterator: 
     3 4 7 8 

Same vector, same loop, reverse_iterator: 
     8 7 4 3 
</PRE></UL>
<A NAME="sec7"><H3>Complexity</H3></A>
<P>All iterator operations are required to take at most amortized constant time.</P>
<A NAME="sec8"><H3>See Also</H3></A>
<P><A HREF="iterators.html">Iterators</A></P>
<A NAME="sec9"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 24.4.1.1</I></P>

<BR>
<HR>
<A HREF="reverse-copy.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><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><A HREF="rotate.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>

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