blob: 160096afb7ab61c723f73cd03711a6a50c53ed99 [file] [log] [blame]
<HTML>
<HEAD>
<TITLE>vector Operations</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="5-1.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="5-3.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library User's Guide</B></DIV>
<H2>5.2 vector Operations</H2>
<A NAME="idx73"><!></A>
<P>In this section, each of the member functions provided by the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> datatype is described in more detail. These member functions provide the basic operations for <B><I>vector</I></B>s. They can be greatly extended through the generic algorithms described in <A HREF="13.html">Chapter&nbsp;13</A>.</P>
<A NAME="521"><H3>5.2.1 Declaration and Initialization of vectors</H3></A>
<A NAME="idx74"><!></A>
<P>Because it is a class template, the declaration of a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> must include a designation of the component type. This can be a primitive language type, like an <SAMP>int</SAMP> or <SAMP>double</SAMP>, a pointer type, or a user-defined type. A user-defined type <I>must</I> implement a copy constructor, as this constructor is used to initialize newly created elements.</P>
<BLOCKQUOTE><HR><B>
REMEMBER -- Elements that are held by a vector must define a copy constructor. Although not used by functions in the vector class, some of the generic algorithms also require vector elements to recognize either the equivalence operator==() or the relational less-than operator&lt;().
</B><HR></BLOCKQUOTE>
<P>Like an <B><I>array</I></B>, a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> is most commonly declared with an integer argument that describes the number of elements the <B><I>vector</I></B> will hold and an initial value for each element:</P>
<UL><PRE>
std::vector&lt;int&gt; vec_one(10,0);
</PRE></UL>
<P>If the type has a default constructor, as it does in this case, then the second argument can be omitted.</P>
<P>For <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>s as well as other C++ Standard Library containers, an allocator type can also be provided as an additional template parameter:</P>
<UL><PRE>
std::vector&lt;int,allocator&lt;int&gt; &gt;
</PRE></UL>
<P>These two declarations are synonymous. Note that if the allocator template parameter is provided explicitly, then its type must match the contained type.</P>
<P>There are a variety of other forms of constructor that can also be used to create <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>s. If no size is provided, the <B><I>vector</I></B> initially contains no elements, and increases in size automatically as elements are added. The copy constructor creates a clone of a <B><I>vector</I></B> from another <B><I>vector</I></B>. </P>
<UL><PRE>
std::vector&lt;int&gt; vec_two(5, 3); // initialization by
// assignment
std::vector&lt;int&gt; vec_three; // no elements
std::vector&lt;int&gt; vec_four(vec_two); // copy constructor
</PRE></UL>
<P>A <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> can also be initialized using elements from another collection, by means of a beginning and ending iterator pair. The arguments can be any form of iterator; thus collections can be initialized with values drawn from any of the container classes in the C++ Standard Library that support iterators. </P>
<UL><PRE>
std::vector&lt;int&gt; vec_five(aList.begin(), aList.end());
</PRE></UL>
<BLOCKQUOTE><HR><B>
NOTE -- Because it requires the ability to define a member function with a template argument different from the class template, some compilers may not yet support the initialization of containers using iterators.
</B><HR></BLOCKQUOTE>
<P>A <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> can be assigned the values of another <B><I>vector</I></B>, in which case the target receives a copy of the argument <B><I>vector</I></B>.</P>
<UL><PRE>
vec_three = vec_five;
</PRE></UL>
<A NAME="idx75"><!></A>
<P>The <SAMP>assign()</SAMP> member function is similar to an assignment, but is more versatile and, in some cases, requires more arguments. Like an assignment, the existing values in the container are deleted, and replaced with the values specified by the arguments.</P>
<P>There are two forms of <SAMP>assign().</SAMP> The first takes two iterator arguments that specify a sub-sequence of an existing container. The values from this sub-sequence then become the new elements in the receiver.</P>
<P>The second version of <SAMP>assign()</SAMP> takes a count and a value. The value must be the same type as the container elements. After the call, the container holds only the number of elements specified by the count, and all elements in the container are equal to the value provided.</P>
<UL><PRE>
vec_six.assign(list_ten.begin(), list_ten.end());
vec_four.assign(3, 7); // three copies of the value 7
vec_five.assign(12, 0); // twelve copies of value zero
</PRE></UL>
<P>If a destructor is defined for the container element type, the destructor is called for each value removed from the collection.</P>
<A NAME="idx76"><!></A>
<P>Finally, two <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>s can exchange their entire contents by means of the <SAMP>swap()</SAMP> operation. The argument container takes on the values of the receiver, while the receiver assumes those of the argument. A swap is very efficient, and should be used in preference to an explicit element-by-element transfer where appropriate.</P>
<UL><PRE>
vec_three.swap(vec_four);
</PRE></UL>
<A NAME="522"><H3>5.2.2 Type Definitions</H3></A>
<A NAME="idx77"><!></A>
<P>The class template <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> includes a number of type definitions, most commonly used in declaration statements. For example, an iterator for a <B><I>vector</I></B> of <SAMP>int</SAMP>s can be declared in the following fashion:</P>
<UL><PRE>
std::vector&lt;int&gt;::iterator location;
</PRE></UL>
<P>In addition to <SAMP>iterator</SAMP>, a vector defines the following types:</P>
<H4><A NAME="Table&nbsp;9">Table&nbsp;9: Type definitions for class vector</A></H4>
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="3">
<tr><td valign=top><B>Type</B>
</td><td valign=top><B>Definition</B>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>value_type</SAMP></P>
</td><td valign=top><P CLASS="TABLE">The type of the elements maintained by the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>.</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>const_iterator</SAMP></P>
</td><td valign=top><P CLASS="TABLE">An iterator that does not allow modification of the underlying sequence.</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>reverse_iterator</SAMP></P>
</td><td valign=top><P CLASS="TABLE">An iterator that moves in a backward direction.</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>const_reverse_iterator</SAMP></P>
</td><td valign=top><P CLASS="TABLE">A combination constant and reverse iterator.</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>reference</SAMP></P>
</td><td valign=top><P CLASS="TABLE">A reference to an underlying element.</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>const_reference</SAMP></P>
</td><td valign=top><P CLASS="TABLE">A reference to an underlying element that will not permit the element to be modified.</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>pointer</SAMP></P>
</td><td valign=top><P CLASS="TABLE">A pointer to an underlying element</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>const_pointer</SAMP></P>
</td><td valign=top><P CLASS="TABLE">A constant pointer to an underlying element.</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>size_type</SAMP></P>
</td><td valign=top><P CLASS="TABLE">An unsigned integer type, used to refer to the size of containers.</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>difference_type</SAMP></P>
</td><td valign=top><P CLASS="TABLE">A signed integer type, used to describe distances between iterators.</P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>allocator_type</SAMP></P>
</td><td valign=top><P CLASS="TABLE">The type of allocator used to manage memory for the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>.</P>
</td></tr>
</TABLE>
<A NAME="523"><H3>5.2.3 Subscripting a vector</H3></A>
<A NAME="idx78"><!></A>
<P>The value being maintained by a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> at a specific index can be accessed or modified using the subscript operator, just like an ordinary array. Also like arrays, there are no attempts to verify the validity of the index values. Indexing a constant <B><I>vector</I></B> yields a constant reference. Attempts to index a <B><I>vector</I></B> outside the range of legal values generates unpredictable and spurious results:</P>
<UL><PRE>
std::cout &lt;&lt; vec_five[1] &lt;&lt; std::endl;
vec_five[1] = 17;
</PRE></UL>
<A NAME="idx79"><!></A>
<P>The member function <SAMP>at()</SAMP> can be used in place of the subscript operator. It takes exactly the same arguments as the subscript operator, and returns exactly the same values, but it will throw an out-of-range exception if the argument is invalid.</P>
<A NAME="idx80"><!></A>
<P>The member function <SAMP>front()</SAMP> returns the first element in the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>, while the member function <SAMP>back()</SAMP> yields the last. Both also return constant references when applied to constant <B><I>vector</I></B>s.</P>
<UL><PRE>
std::cout &lt;&lt; vec_five.front() &lt;&lt; " ... "
&lt;&lt; vec_five.back() &lt;&lt; std::endl;
</PRE></UL>
<A NAME="524"><H3>5.2.4 Extent and Size-Changing Operations</H3></A>
<A NAME="idx81"><!></A>
<P>In general, there are three different <I>sizes</I> associated with any <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>: </P>
<UL>
<LI><P CLASS="LIST">the number of elements currently being held by the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B></P></LI>
<LI><P CLASS="LIST">the maximum size to which the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> can be expanded without requiring that new storage be allocated</P></LI>
<LI><P CLASS="LIST">the upper limit on the size of any <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>. </P></LI>
</UL>
<A NAME="idx82"><!></A>
<P>These three values are yielded by the member functions <SAMP>size()</SAMP>, <SAMP>capacity()</SAMP>, and <SAMP>max_size()</SAMP>, respectively:</P>
<UL><PRE>
std::cout &lt;&lt; "size: " &lt;&lt; vec_five.size() &lt;&lt; std::endl;
std::cout &lt;&lt; "capacity: " &lt;&lt; vec_five.capacity() &lt;&lt; std::endl;
std::cout &lt;&lt; "max_size: " &lt;&lt; vec_five.max_size() &lt;&lt; std::endl;
</PRE></UL>
<P>The size is simply the number of elements in the vector. The maximum size is usually limited only by the amount of available memory, or the largest value that can be described by the datatype <SAMP>size_type</SAMP>. The capacity is more difficult to characterize. As noted in <A HREF="5-2.html#525">Section&nbsp;5.2.5</A>, elements can be added to or removed from a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> in a variety of ways. When elements are removed from a <B><I>vector</I></B>, the memory for the <B><I>vector</I></B> is generally not reallocated, and thus the size is decreased but the capacity remains the same. A subsequent insertion does not force a reallocation of new memory if the original capacity is not exceeded.</P>
<A NAME="idx83"><!></A>
<P>An insertion that causes the size to exceed the capacity generally results in a new block of memory being allocated to hold the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> elements. Values are then copied into this new memory using the assignment operator appropriate to the element type, and the old memory is deleted. Because this can be a potentially costly operation, the <B><I>vector</I></B> datatype provides a means for the programmer to specify a value for the capacity of a <B><I>vector</I></B>. The member function <SAMP>reserve()</SAMP> is a directive to the <B><I>vector</I></B>, indicating that the <B><I>vector</I></B> is expected to grow to at least the given size. If the argument used with <SAMP>reserve()</SAMP> is larger than the current capacity, a reallocation occurs and the argument value becomes the new capacity. (It may subsequently grow even larger; the value given as the argument need not be a bound, just a guess.) If the capacity is already in excess of the argument, no reallocation takes place. Invoking <SAMP>reserve()</SAMP> does not change the size of the <B><I>vector</I></B>, nor the element values themselves. However, the elements may change location in memory should reallocation take place.</P>
<UL><PRE>
vec_five.reserve(20);
</PRE></UL>
<P>A reallocation invalidates all references, pointers, and iterators referring to elements being held by a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>.</P>
<A NAME="idx84"><!></A>
<P>The member function <SAMP>empty()</SAMP> returns true if the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> currently has a size of zero, regardless of the capacity of the <B><I>vector</I></B>. Using this function is generally more efficient than comparing the result returned by <SAMP>size()</SAMP> to zero.</P>
<UL><PRE>
std::cout &lt;&lt; "empty is " &lt;&lt; vec_five.empty() &lt;&lt; std::endl;
</PRE></UL>
<A NAME="idx85"><!></A>
<P>The member function <SAMP>resize()</SAMP> takes two arguments, a size and a value of the container member type. The value argument is optional if the member type has a default constructor. <SAMP>resize()</SAMP> changes the size of the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> to the size specified, adding or erasing elements as needed. If elements are added, their initial contents will be copied from the value argument, or created using the member type's default constructor if no value is provided.</P>
<P>If a destructor is defined for the element type, the destructor is called for any elements that are removed from the collection:</P>
<UL><PRE>
// resize to 12 elements, adding values of 17 if necessary
vec_five.resize (12, 17);
</PRE></UL>
<BLOCKQUOTE><HR><B>
NOTE -- A vector stores values in a single large block of memory. A deque, on the other hand, employs a number of smaller blocks. This difference may be important on machines that limit the size of any single block of memory, because in such cases a deque will be able to hold much larger collections than a vector.
</B><HR></BLOCKQUOTE>
<A NAME="525"><H3>5.2.5 Inserting and Removing Elements</H3></A>
<A NAME="idx86"><!></A>
<P>As noted earlier, unlike an ordinary array, the class template <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> can increase or decrease in size in certain circumstances. When an insertion causes the number of elements being held in a <B><I>vector</I></B> to exceed the capacity of the current block of memory being used to hold the values, a new block is allocated and the elements are copied to the new storage.</P>
<BLOCKQUOTE><HR><B>
NOTE -- Even adding a single element to a vector can, in the worst case, require time proportional to the number of elements in the vector, as each element is moved to a new location. If insertions are a prominent feature of your current problem, you should explore the possibility of using containers which are optimized for insert operations, such as lists or sets.
</B><HR></BLOCKQUOTE>
<A NAME="idx87"><!></A>
<P>A new element can be added to the back of a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> using the function <SAMP>push_back()</SAMP>. If there is space in the current allocation, this operation is very efficient (constant time). </P>
<UL><PRE>
vec_five.push_back(21); // add element with value of 21 to vec_five
</PRE></UL>
<A NAME="idx88"><!></A>
<P>The corresponding removal operation is <SAMP>pop_back()</SAMP>, which decreases the size of the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>, but does not change its capacity. If the element type defines a destructor, the destructor is called on the element being removed. Again, this operation is very efficient. (The class template <B><I><A HREF="../stdlibref/deque.html">deque</A></I></B> permits values to be added and removed from both the back and the front of the collection, as described in <A HREF="7.html">Chapter&nbsp;7</A>.)</P>
<A NAME="idx89"><!></A>
<P>More general insertion operations can be performed using the <SAMP>insert()</SAMP> member function. The location of the insertion is described by an iterator; insertion takes place immediately preceding the location denoted. A fixed number of constant elements can be inserted by a single function call. It is much more efficient to insert a block of elements in a single call than to perform a sequence of individual insertions, because with a single call at most one allocation will be performed.</P>
<UL><PRE>
// find the location of the 7
std::vector&lt;int&gt;::iterator where =
std::find(vec_five.begin(), vec_five.end(), 7);
// then insert the 12 before the 7
vec_five.insert(where, 12);
vec_five.insert(where, 6, 14); // insert six copies of 14
</PRE></UL>
<P>The most general form of the <SAMP>insert()</SAMP> member function takes a position and a pair of iterators that denote a sub-sequence from another container. The range of values described by the sequence is inserted into the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>. Again, using this function is preferable to using a sequence of individual insertions because at most a single allocation is performed.</P>
<UL><PRE>
vec_five.insert (where, vec_three.begin(), vec_three.end());
</PRE></UL>
<BLOCKQUOTE><HR><B>
NOTE -- Once more, it is important to remember that should an insertion cause reallocation, all references or pointers to elements in the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>, and all iterators associated with the <B><I>vector</I></B> become invalid.
</B><HR></BLOCKQUOTE>
<P>In addition to the <SAMP>pop_back()</SAMP> member function, which removes elements from the end of a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>, a function exists that removes elements from the middle of a <B><I>vector</I></B>, using an iterator to denote the location. The member function that performs this task is <SAMP>erase()</SAMP>. The function has two forms: </P>
<UL>
<LI><P CLASS="LIST">the first takes a single iterator and removes an individual value</P></LI>
<UL><PRE>
vec_five.erase(where);
</PRE></UL>
<LI><P CLASS="LIST">the second takes a pair of iterators and removes all values in the given range. The size of the <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> is reduced, but the capacity is unchanged. If the container type defines a destructor, the destructor is invoked on the eliminated values:</P></LI>
<UL><PRE>
// erase from the 12 to the end
where = std::find(vec_five.begin(), vec_five.end(), 12);
vec_five.erase(where, vec_five.end());
</PRE></UL>
</UL>
<BLOCKQUOTE><HR><B>
NOTE -- When an element is erased, all references or pointers to elements after the erased element become invalid. Iterators that refer to a position after the erased element also become invalid.
</B><HR></BLOCKQUOTE>
<A NAME="526"><H3>5.2.6 Iteration</H3></A>
<A NAME="idx90"><!></A>
<P>The member functions <SAMP>begin()</SAMP> and <SAMP>end()</SAMP> yield random access iterators for the container. Again, we note that the iterators yielded by these operations can become invalidated after insertions or removals of elements. The member functions <SAMP>rbegin()</SAMP> and <SAMP>rend()</SAMP> return similar iterators, but these access the underlying elements in reverse order. Constant iterators are returned if the original container is declared as constant, or if the target of the assignment or parameter is constant.</P>
<A NAME="527"><H3>5.2.7 Test for Inclusion</H3></A>
<A NAME="idx91"><!></A>
<P>A <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> does not directly provide any method that can be used to determine if a specific value is contained in the collection. However, the generic algorithms <SAMP>std::find()</SAMP> or <SAMP>std::count()</SAMP> can be used for this purpose (see <A HREF="13-3.html#1331">Section&nbsp;13.3.1</A> and <A HREF="13-6.html#1361">Section&nbsp;13.6.1</A>). For example, the following statement tests to see whether an integer <B><I>vector</I></B> contains an element with a value of 17:</P>
<UL><PRE>
std::find(vec_five.begin(), vec_five.end(), 17);
</PRE></UL>
<P>If your compiler does not support partial specialization, then you must use the following interface instead:</P>
<UL><PRE>
int num = 0;
std::count(vec_five.begin(), vec_five.end(), 17, num);
if (num)
std::cout &lt;&lt; "contains a 17" &lt;&lt; std::endl;
else
std::cout &lt;&lt; "does not contain a 17" &lt;&lt; std::endl;
</PRE></UL>
<A NAME="528"><H3>5.2.8 Sorting and Sorted vector Operations</H3></A>
<A NAME="idx92"><!></A>
<P>A <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> does not automatically maintain its values in sequence. However, a <B><I>vector</I></B> can be placed in order using the generic algorithm <SAMP>std::sort()</SAMP> (see <A HREF="14-2.html">Section&nbsp;14.2</A>). The simplest form of <SAMP>sort()</SAMP> uses <SAMP>operator&lt;()</SAMP> for comparisons. An alternative version of <SAMP>sort() </SAMP>permits the programmer to specify the comparison operator explicitly. This can be used, for example, to place the elements in descending rather than ascending order: </P>
<UL><PRE>
// sort ascending
std::sort(aVec.begin(), aVec.end());
// sort descending, specifying the ordering function explicitly
std::sort(aVec.begin(), aVec.end(), std::greater&lt;int&gt;() );
// alternate way to sort descending
std::sort(aVec.rbegin(), aVec.rend());
</PRE></UL>
<P>A number of the operations described in <A HREF="14.html">Chapter&nbsp;14</A> can be applied to a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> holding an ordered collection. For example, two <B><I>vector</I></B>s can be merged using the generic algorithm <SAMP>std::merge()</SAMP> (see <A HREF="14-5.html">Section&nbsp;14.5</A>).</P>
<UL><PRE>
// merge two vectors, print output
std::merge(vecOne.begin(), vecOne.end(),
vecTwo.begin(), vecTwo.end(),
std::ostream_iterator&lt;int,char&gt; (std::cout, " "));
</PRE></UL>
<P>Binary search algorithms (see <A HREF="14-4.html">Section&nbsp;14.4</A>) can also be used on a sorted <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>. These searches are more efficient than a linear traversal algorithm such as <SAMP>find(). </SAMP>If your problem involves multiple searches on a <B><I>vector</I></B>, sorting the <B><I>vector</I></B> and then using an efficient search is a good strategy.</P>
<A NAME="529"><H3>5.2.9 Useful Generic Algorithms</H3></A>
<A NAME="idx93"><!></A>
<P>Most of the algorithms described in <A HREF="IV.html">Part&nbsp;IV</A> can be used with <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>s, but some are more useful than others. For example, the maximum value in a <B><I>vector</I></B> can be determined as follows:</P>
<UL><PRE>
vector&lt;int&gt;::iterator where =
std::max_element (vec_five.begin(), vec_five.end());
std::cout &lt;&lt; "maximum is " &lt;&lt; *where &lt;&lt; std::endl;
</PRE></UL>
<A NAME="idx94"><!></A>
<P> <A HREF="5-2.html#Table&nbsp;10">Table&nbsp;10</A> summarizes some of the algorithms that are especially useful with <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>s:</P>
<H4><A NAME="Table&nbsp;10">Table&nbsp;10: Generic algorithms useful with vectors&nbsp;</A></H4>
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="3">
<tr><td valign=top><B> Algorithm<B> </B></B>
</td><td valign=top><B>Purpose </B>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>fill</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Fill a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> with a given initial value </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>copy</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Copy one sequence into another </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>generate</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Copy values from a generator into a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>find</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Find an element that matches a condition </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>adjacent_find</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Find consecutive duplicate elements </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>search</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Find a sub-sequence within a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>max_element, min_element</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Locate maximum or minimum element </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>reverse</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Reverse order of elements </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>replace</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Replace elements with new values </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>rotate</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Rotate elements around a midpoint </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>partition</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Partition elements into two groups </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>next_permutation</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Generate permutations </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>inplace_merge</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Inplace merge within a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>random_shuffle</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Randomly shuffle elements in <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>count</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Count number of elements that satisfy condition </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>accumulate</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Reduce <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> to a single value </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>inner_product</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Inner product of two <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>s </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>equal</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Test two <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B>s for pair-wise equality </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>lexicographical_compare </SAMP></P>
</td><td valign=top><P CLASS="TABLE">Lexical comparison </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>transform</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Apply transformation to a <B><I><A HREF="../stdlibref/vector.html">vector</A></I></B> </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>partial_sum</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Partial sums of values </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>adjacent_difference</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Adjacent differences of value </P>
</td></tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>for_each</SAMP></P>
</td><td valign=top><P CLASS="TABLE">Execute function on each element </P>
</td></tr>
</TABLE>
<BR>
<HR>
<A HREF="5-1.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="5-3.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>