<HTML>
<HEAD>
<TITLE>search(), search_n()</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="runtime-error.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="sequences.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>search(), search_n()</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">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
No Entries
<A NAME="sec2"><H3>Summary</H3></A>
<P>An algorithm that finds a subsequence within a sequence of values</P>
<A NAME="sec3"><H3>Synopsis</H3></A>

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

namespace std {
  template &lt;class ForwardIterator1, class ForwardIterator2&gt;
  ForwardIterator1 search(ForwardIterator1 start1,
                          ForwardIterator1 finish1,
                          ForwardIterator2 start2,
                          ForwardIterator2 finish2);

  template &lt;class ForwardIterator1,
            class ForwardIterator2,
            class BinaryPredicate&gt;
  ForwardIterator1 search(ForwardIterator1 start1,
                          ForwardIterator1 finish1,
                          ForwardIterator2 start2,
                          ForwardIterator2 finish2,
                          BinaryPredicate binary_pred);

  template &lt;class ForwardIterator, class Size, class T&gt;
  ForwardIterator search_n(ForwardIterator start,
                           ForwardIterator finish,
                           Size count, const T&amp; value);

  template &lt;class ForwardIterator, class Size,
            class T, class BinaryPredicate&gt;
  ForwardIterator search_n(ForwardIterator start 
                           ForwardIterator finish,
                           Size count, const T&amp; value,
                           BinaryPredicate pred)
}
</PRE>
<A NAME="sec4"><H3>Description</H3></A>
<P>The <SAMP>search()</SAMP> and <SAMP><A HREF="search.html">search_n()</A></SAMP> algorithms search for a subsequence within a sequence. The <SAMP>search()</SAMP> algorithm searches for a subsequence <SAMP>[start2, finish2) </SAMP>within a sequence <SAMP>[start1, finish1)</SAMP>, and returns the beginning location of the subsequence.   If it does not find the subsequence, <SAMP>search()</SAMP> returns <SAMP>finish1</SAMP>. The first version of <SAMP>search()</SAMP> uses <SAMP>operator==()</SAMP> as a default, and the second version allows you to specify a binary predicate to perform the comparison.</P>
<P>The <SAMP><A HREF="search.html">search_n()</A></SAMP> algorithm searches for the subsequence composed of <SAMP>count</SAMP> occurrences of <SAMP>value</SAMP> within a sequence <SAMP>[start, finish)</SAMP>, and returns <SAMP>start</SAMP> if this subsequence is found. If it does not find the subsequence, <SAMP>search_n()</SAMP> returns <SAMP>finish</SAMP>. The first version of <SAMP>search_n()</SAMP> uses <SAMP>operator==()</SAMP> as a default, and the second version allows you to specify a binary predicate to perform the comparison.</P>
<A NAME="sec5"><H3>Complexity</H3></A>
<P><SAMP>search()</SAMP> performs at most <SAMP>(finish1 - start1)*(finish2-start2) </SAMP>applications of the corresponding predicate.</P>
<P><SAMP><A HREF="search.html">search_n()</A></SAMP> performs at most<SAMP> (finish - start)* count</SAMP> applications of the corresponding predicate.</P>
<A NAME="sec6"><H3>Example</H3></A>

<UL><PRE>//
//  search.cpp
//

#include &lt;algorithm&gt;
#include &lt;list&gt;
#include &lt;iostream&gt;


int main ()
{
#ifndef _RWSTD_NO_NAMESPACE
  using namespace std;
#endif

  // Initialize a list sequence and subsequence with 
  // characters.

  char seq[40]    = "Here's a string with a substring in it";
  char subseq[10] = "substring";
  list&lt;char,allocator&lt;char&gt; &gt; sequence(seq, seq+38);
  list&lt;char,allocator&lt;char&gt; &gt; subseqnc(subseq, subseq+9);

  // Print out the original sequence.

  cout &lt;&lt; endl &lt;&lt; "The subsequence, " &lt;&lt; subseq 
       &lt;&lt; ", was found at the ";
  cout &lt;&lt; endl &lt;&lt; "location identified by a '*'" 
       &lt;&lt; endl &lt;&lt; "     ";

  // Create an iterator to identify the location of 
  // subsequence within sequence.

  list&lt;char,allocator&lt;char&gt; &gt;::iterator place;

  // Do search.

  place = search(sequence.begin(), sequence.end(),
                 subseqnc.begin(), subseqnc.end());

  // Identify result by marking first character with a '*'.

  *place = '*';

  // Output sequence to display result.

  for (list&lt;char,allocator&lt;char&gt; &gt;::iterator i = 
       sequence.begin(); i != sequence.end(); i++)
    cout &lt;&lt; *i;
  cout &lt;&lt; endl;

  return 0;
}


Program Output:
</PRE></UL>
<UL><PRE>
The subsequence, substring, was found at the 
location identified by a '*'
     Here's a string with a *ubstring in it

</PRE></UL>
<A NAME="sec7"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 25.1.9</I></P>

<UL><PRE>
</PRE></UL>


<BR>
<HR>
<A HREF="runtime-error.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="sequences.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>
