<HTML>
<HEAD>
<TITLE>for_each()</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="find-if.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="forwarditerators.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>for_each()</H2>
<P><B>Library:</B>&nbsp;&nbsp;<A HREF="2-9.html">Algorithms</A></P>

<PRE><HR><B><I>Function</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">Complexity</A></LI>
<LI><A HREF="#sec6">Example</A></LI>
<LI><A HREF="#sec7">See Also</A></LI>
<LI><A HREF="#sec8">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
No Entries
<A NAME="sec2"><H3>Summary</H3></A>
<P>Algorithm that applies a function to each element in a range</P>
<A NAME="sec3"><H3>Synopsis</H3></A>

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

namespace std {
  template &lt;class InputIterator, class Function&gt;
  void Function for_each(InputIterator start, 
                         InputIterator finish,
                         Function f);
}
</PRE>
<A NAME="sec4"><H3>Description</H3></A>
<P>The <SAMP>for_each()</SAMP> algorithm applies the function object <SAMP>f</SAMP> to each value in the range <SAMP>[start, finish)</SAMP>, where <SAMP>start</SAMP> and <SAMP>finish</SAMP> are iterators that define the sequence. Since this a non-mutating algorithm, the function <SAMP>f</SAMP> cannot make any modifications to the sequence, but it can achieve results through side effects (such as copying or printing). If <SAMP>f</SAMP> returns a result, the result is ignored.</P>
<P><SAMP>for_each()</SAMP> returns the function object <SAMP>f</SAMP>.</P>
<A NAME="sec5"><H3>Complexity</H3></A>
<P>The function object <SAMP>f</SAMP> is applied exactly <SAMP>finish - start</SAMP> times.</P>
<A NAME="sec6"><H3>Example</H3></A>

<UL><PRE>//
// for_each.cpp
//

#include &lt;algorithm&gt;    // for for_each
#include &lt;functional&gt;   // for less, unary_function
#include &lt;iostream&gt;     // for cout, endl
#include &lt;set&gt;          // for set



// Function object that outputs its argument times x.
template &lt;class Arg&gt;
class out_times_x:  public std::unary_function&lt;Arg, void&gt;
{
    Arg multiplier;
public:
    out_times_x(const Arg &amp;x) : multiplier (x) { }

    void operator()(const Arg &amp;x) const {
        std::cout &lt;&lt; x * multiplier &lt;&lt; " " &lt;&lt; std::endl;
    }
};


int main ()
{
    // Typedef for convenience.
    typedef std::set&lt;int, std::less&lt;int&gt;, 
                     std::allocator&lt;int&gt; &gt; sequence;
    
    sequence::value_type arr [] = { 1, 2, 3, 4, 5 };

    // Populate a sequence from arr.
    sequence s(arr, arr + sizeof arr / sizeof *arr);

    // Construct a function object.
    out_times_x&lt;sequence::value_type&gt; f2(2);
  
    // Apply function object's operator() to each element.
    std::for_each(s.begin(), s.end(), f2);
  
    return 0;
}


Program Output
</PRE></UL>
<UL><PRE>2 
4 
6 
8 
10 
</PRE></UL>
<A NAME="sec7"><H3>See Also</H3></A>
<P><A HREF="algorithms.html">Algorithms</A>, <A HREF="functionobjects.html">Function Objects</A></P>
<A NAME="sec8"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 25.1.1</I></P>

<BR>
<HR>
<A HREF="find-if.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="forwarditerators.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>
