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