1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
|
<HTML>
<!--
-- Copyright (c) 1996-1999
-- Silicon Graphics Computer Systems, Inc.
--
-- Permission to use, copy, modify, distribute and sell this software
-- and its documentation for any purpose is hereby granted without fee,
-- provided that the above copyright notice appears in all copies and
-- that both that copyright notice and this permission notice appear
-- in supporting documentation. Silicon Graphics makes no
-- representations about the suitability of this software for any
-- purpose. It is provided "as is" without express or implied warranty.
--
-- Copyright (c) 1994
-- Hewlett-Packard Company
--
-- Permission to use, copy, modify, distribute and sell this software
-- and its documentation for any purpose is hereby granted without fee,
-- provided that the above copyright notice appears in all copies and
-- that both that copyright notice and this permission notice appear
-- in supporting documentation. Hewlett-Packard Company makes no
-- representations about the suitability of this software for any
-- purpose. It is provided "as is" without express or implied warranty.
--
-->
<Head>
<Title>unique</Title>
<!-- Generated by htmldoc -->
</HEAD>
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
ALINK="#ff0000">
<IMG SRC="CorpID.gif"
ALT="SGI" HEIGHT="43" WIDTH="151">
<!--end header-->
<BR Clear>
<H1>unique</H1>
<Table CellPadding=0 CellSpacing=0 width=100%>
<TR>
<TD Align=left><Img src = "algorithms.gif" Alt="" WIDTH = "194" HEIGHT = "38" ></TD>
<TD Align=right><Img src = "function.gif" Alt="" WIDTH = "194" HEIGHT = "38" ></TD>
</TR>
<TR>
<TD Align=left VAlign=top><b>Category</b>: algorithms</TD>
<TD Align=right VAlign=top><b>Component type</b>: function</TD>
</TR>
</Table>
<h3>Prototype</h3>
<tt>Unique</tt> is an overloaded name; there are actually two <tt>unique</tt>
functions.
<pre>
template <class <A href="ForwardIterator.html">ForwardIterator</A>>
ForwardIterator unique(ForwardIterator first, ForwardIterator last);
template <class <A href="ForwardIterator.html">ForwardIterator</A>, class <A href="BinaryPredicate.html">BinaryPredicate</A>>
ForwardIterator unique(ForwardIterator first, ForwardIterator last,
BinaryPredicate binary_pred);
</pre>
<h3>Description</h3>
Every time a consecutive group of duplicate elements appears in the
range <tt>[first, last)</tt>, the algorithm <tt>unique</tt> removes all but the
first element. That is, <tt>unique</tt> returns an iterator
<tt>new_last</tt> such that the range <tt>[first, new_last)</tt> contains no
two consecutive elements that are duplicates. <A href="#1">[1]</A>
The iterators in the range <tt>[new_last, last)</tt> are all still
dereferenceable, but the elements that they point to are unspecified.
<tt>Unique</tt> is stable, meaning that the relative order of elements that
are not removed is unchanged.
<P>
The reason there are two different versions of <tt>unique</tt> is that there
are two different definitions of what it means for a consecutive group
of elements to be duplicates. In the first version, the test is
simple equality: the elements in a range <tt>[f, l)</tt> are duplicates if,
for every iterator <tt>i</tt> in the range, either <tt>i == f</tt> or else <tt>*i == *(i-1)</tt>.
In the second, the test is an arbitrary <A href="BinaryPredicate.html">Binary Predicate</A>
<tt>binary_pred</tt>: the elements in <tt>[f, l)</tt> are duplicates if, for every
iterator <tt>i</tt> in the range, either <tt>i == f</tt> or else
<tt>binary_pred(*i, *(i-1))</tt> is <tt>true</tt>. <A href="#2">[2]</A>
<h3>Definition</h3>
Defined in the standard header <A href="algorithm">algorithm</A>, and in the nonstandard
backward-compatibility header <A href="algo.h">algo.h</A>.
<h3>Requirements on types</h3>
For the first version:
<UL>
<LI>
<tt>ForwardIterator</tt> is a model of <A href="ForwardIterator.html">Forward Iterator</A>.
<LI>
<tt>ForwardIterator</tt> is mutable.
<LI>
<tt>ForwardIterator</tt>'s value type is <A href="EqualityComparable.html">Equality Comparable</A>.
</UL>
For the second version:
<UL>
<LI>
<tt>ForwardIterator</tt> is a model of <A href="ForwardIterator.html">Forward Iterator</A>.
<LI>
<tt>ForwardIterator</tt> is mutable.
<LI>
<tt>BinaryPredicate</tt> is a model of <A href="BinaryPredicate.html">Binary Predicate</A>. <A href="#3">[3]</A>
<LI>
<tt>ForwardIterator</tt>'s value type is convertible to <tt>BinaryPredicate</tt>'s
first argument type and to <tt>BinaryPredicate</tt>'s second argument type.
</UL>
<h3>Preconditions</h3>
<UL>
<LI>
<tt>[first, last)</tt> is a valid range.
</UL>
<h3>Complexity</h3>
Linear. Exactly <tt>(last - first) - 1</tt> applications of <tt>operator==</tt>
(in the case of the first version of <tt>unique</tt>) or of <tt>binary_pred</tt>
(in the case of the second version).
<h3>Example</h3>
Remove duplicates from consecutive groups of equal <tt>int</tt>s.
<pre>
<A href="Vector.html">vector</A><int> V;
V.push_back(1);
V.push_back(3);
V.push_back(3);
V.push_back(3);
V.push_back(2);
V.push_back(2);
V.push_back(1);
<A href="Vector.html">vector</A><int>::iterator new_end = unique(V.begin(), V.end());
<A href="copy.html">copy</A>(V.begin(), new_end, <A href="ostream_iterator.html">ostream_iterator</A><int>(cout, " "));
// The output it "1 3 2 1".
</pre>
<P>
Remove all duplicates from a vector of <tt>char</tt>s, ignoring case. First
sort the vector, then remove duplicates from consecutive groups.
<pre>
inline bool eq_nocase(char c1, char c2) { return tolower(c1) == tolower(c2); }
inline bool lt_nocase(char c1, char c2) { return tolower(c1) < tolower(c2); }
int main()
{
const char init[] = "The Standard Template Library";
<A href="Vector.html">vector</A><char> V(init, init + sizeof(init));
<A href="sort.html">sort</A>(V.begin(), V.end(), lt_nocase);
<A href="copy.html">copy</A>(V.begin(), V.end(), <A href="ostream_iterator.html">ostream_iterator</A><char>(cout));
cout << endl;
<A href="Vector.html">vector</A><char>::iterator new_end = unique(V.begin(), V.end(), eq_nocase);
<A href="copy.html">copy</A>(V.begin(), new_end, <A href="ostream_iterator.html">ostream_iterator</A><char>(cout));
cout << endl;
}
// The output is:
// aaaabddeeehiLlmnprrrStTtTy
// abdehiLmnprSty
</pre>
<h3>Notes</h3>
<P><A name="1">[1]</A>
Note that the meaning of "removal" is somewhat subtle. <tt>Unique</tt>,
like <tt><A href="remove.html">remove</A></tt>, does not destroy any iterators and does not change
the distance between <tt>first</tt> and <tt>last</tt>. (There's no way that it
could do anything of the sort.) So, for example, if <tt>V</tt> is a
<A href="Vector.html">vector</A>, <tt>remove(V.begin(), V.end(), 0)</tt> does not change
<tt>V.size()</tt>: <tt>V</tt> will contain just as many elements as it did before.
<tt>Unique</tt> returns an iterator that points to the end of the resulting
range after elements have been removed from it; it follows that the
elements after that iterator are of no interest. If you are operating
on a <A href="Sequence.html">Sequence</A>, you may wish to use the <A href="Sequence.html">Sequence</A>'s <tt>erase</tt>
member function to discard those elements entirely.
<P><A name="2">[2]</A>
Strictly speaking, the first version of <tt>unique</tt> is redundant:
you can achieve the same functionality by using an object of class
<tt><A href="equal_to.html">equal_to</A></tt> as the <A href="BinaryPredicate.html">Binary Predicate</A> argument. The first version
is provided strictly for the sake of convenience: testing for equality
is an important special case.
<P><A name="3">[3]</A>
<tt>BinaryPredicate</tt> is not required to be an equivalence
relation. You should be cautious, though, about using <tt>unique</tt> with a
<A href="BinaryPredicate.html">Binary Predicate</A> that is not an equivalence relation: you could
easily get unexpected results.
<h3>See also</h3>
<tt><A href="BinaryPredicate.html">Binary Predicate</A></tt>, <tt><A href="remove.html">remove</A></tt>, <tt><A href="remove_if.html">remove_if</A></tt>, <tt><A href="unique_copy.html">unique_copy</A></tt>,
<tt><A href="adjacent_find.html">adjacent_find</A></tt>,
<!--start footer-->
<HR SIZE="6">
<A href="http://www.sgi.com/"><IMG SRC="surf.gif" HEIGHT="54" WIDTH="54"
ALT="[Silicon Surf]"></A>
<A HREF="index.html"><IMG SRC="stl_home.gif"
HEIGHT="54" WIDTH="54" ALT="[STL Home]"></A>
<BR>
<FONT SIZE="-2">
<A href="http://www.sgi.com/Misc/sgi_info.html" TARGET="_top">Copyright ©
1999 Silicon Graphics, Inc.</A> All Rights Reserved.</FONT>
<FONT SIZE="-3"><a href="http://www.sgi.com/Misc/external.list.html" TARGET="_top">TrademarkInformation</A>
</FONT>
<P>
</BODY>
</HTML>
|