• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Filter Iterator</title>
5<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../../index.html" title="Chapter 1. Boost.Iterator">
8<link rel="up" href="../specialized.html" title="Specialized Adaptors">
9<link rel="prev" href="../specialized.html" title="Specialized Adaptors">
10<link rel="next" href="function_output.html" title="Function Output Iterator">
11</head>
12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13<table cellpadding="2" width="100%"><tr>
14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
15<td align="center"><a href="../../../../../../index.html">Home</a></td>
16<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
20</tr></table>
21<hr>
22<div class="spirit-nav">
23<a accesskey="p" href="../specialized.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../specialized.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="function_output.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h3 class="title">
27<a name="iterator.specialized.filter"></a><a class="link" href="filter.html" title="Filter Iterator">Filter Iterator</a>
28</h3></div></div></div>
29<p>
30        The filter iterator adaptor creates a view of an iterator range in which
31        some elements of the range are skipped. A predicate function object controls
32        which elements are skipped. When the predicate is applied to an element,
33        if it returns <code class="computeroutput"><span class="keyword">true</span></code> then the
34        element is retained and if it returns <code class="computeroutput"><span class="keyword">false</span></code>
35        then the element is skipped over. When skipping over elements, it is necessary
36        for the filter adaptor to know when to stop so as to avoid going past the
37        end of the underlying range. A filter iterator is therefore constructed with
38        pair of iterators indicating the range of elements in the unfiltered sequence
39        to be traversed.
40      </p>
41<h3>
42<a name="iterator.specialized.filter.h0"></a>
43        <span class="phrase"><a name="iterator.specialized.filter.example"></a></span><a class="link" href="filter.html#iterator.specialized.filter.example">Example</a>
44      </h3>
45<p>
46        This example uses <code class="computeroutput"><span class="identifier">filter_iterator</span></code>
47        and then <code class="computeroutput"><span class="identifier">make_filter_iterator</span></code>
48        to output only the positive integers from an array of integers. Then <code class="computeroutput"><span class="identifier">make_filter_iterator</span></code> is is used to output
49        the integers greater than <code class="computeroutput"><span class="special">-</span><span class="number">2</span></code>.
50      </p>
51<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">is_positive_number</span> <span class="special">{</span>
52  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="number">0</span> <span class="special">&lt;</span> <span class="identifier">x</span><span class="special">;</span> <span class="special">}</span>
53<span class="special">};</span>
54
55<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
56<span class="special">{</span>
57  <span class="keyword">int</span> <span class="identifier">numbers_</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0</span><span class="special">,</span> <span class="special">-</span><span class="number">1</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="special">-</span><span class="number">3</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">8</span><span class="special">,</span> <span class="special">-</span><span class="number">2</span> <span class="special">};</span>
58  <span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">N</span> <span class="special">=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">numbers_</span><span class="special">)/</span><span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">int</span><span class="special">);</span>
59
60  <span class="keyword">typedef</span> <span class="keyword">int</span><span class="special">*</span> <span class="identifier">base_iterator</span><span class="special">;</span>
61  <span class="identifier">base_iterator</span> <span class="identifier">numbers</span><span class="special">(</span><span class="identifier">numbers_</span><span class="special">);</span>
62
63  <span class="comment">// Example using filter_iterator</span>
64  <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">filter_iterator</span><span class="special">&lt;</span><span class="identifier">is_positive_number</span><span class="special">,</span> <span class="identifier">base_iterator</span><span class="special">&gt;</span>
65    <span class="identifier">FilterIter</span><span class="special">;</span>
66
67  <span class="identifier">is_positive_number</span> <span class="identifier">predicate</span><span class="special">;</span>
68  <span class="identifier">FilterIter</span> <span class="identifier">filter_iter_first</span><span class="special">(</span><span class="identifier">predicate</span><span class="special">,</span> <span class="identifier">numbers</span><span class="special">,</span> <span class="identifier">numbers</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">);</span>
69  <span class="identifier">FilterIter</span> <span class="identifier">filter_iter_last</span><span class="special">(</span><span class="identifier">predicate</span><span class="special">,</span> <span class="identifier">numbers</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">,</span> <span class="identifier">numbers</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">);</span>
70
71  <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">filter_iter_first</span><span class="special">,</span> <span class="identifier">filter_iter_last</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">" "</span><span class="special">));</span>
72  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
73
74  <span class="comment">// Example using make_filter_iterator()</span>
75  <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special">&lt;</span><span class="identifier">is_positive_number</span><span class="special">&gt;(</span><span class="identifier">numbers</span><span class="special">,</span> <span class="identifier">numbers</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">),</span>
76            <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special">&lt;</span><span class="identifier">is_positive_number</span><span class="special">&gt;(</span><span class="identifier">numbers</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">,</span> <span class="identifier">numbers</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">),</span>
77            <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">" "</span><span class="special">));</span>
78  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
79
80  <span class="comment">// Another example using make_filter_iterator()</span>
81  <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span>
82      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special">(</span>
83          <span class="identifier">std</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">greater</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">placeholders</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="special">-</span><span class="number">2</span><span class="special">)</span>
84        <span class="special">,</span> <span class="identifier">numbers</span><span class="special">,</span> <span class="identifier">numbers</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">)</span>
85
86    <span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special">(</span>
87          <span class="identifier">std</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">greater</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">placeholders</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="special">-</span><span class="number">2</span><span class="special">)</span>
88        <span class="special">,</span> <span class="identifier">numbers</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">,</span> <span class="identifier">numbers</span> <span class="special">+</span> <span class="identifier">N</span><span class="special">)</span>
89
90    <span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">" "</span><span class="special">)</span>
91  <span class="special">);</span>
92
93  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
94
95  <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">exit_success</span><span class="special">;</span>
96<span class="special">}</span>
97</pre>
98<p>
99        The output is:
100      </p>
101<pre class="programlisting">4 5 8
1024 5 8
1030 -1 4 5 8
104</pre>
105<p>
106        The source code for this example can be found <a href="../../../../example/filter_iterator_example.cpp" target="_top">here</a>.
107      </p>
108<h3>
109<a name="iterator.specialized.filter.h1"></a>
110        <span class="phrase"><a name="iterator.specialized.filter.reference"></a></span><a class="link" href="filter.html#iterator.specialized.filter.reference">Reference</a>
111      </h3>
112<h4>
113<a name="iterator.specialized.filter.h2"></a>
114        <span class="phrase"><a name="iterator.specialized.filter.synopsis"></a></span><a class="link" href="filter.html#iterator.specialized.filter.synopsis">Synopsis</a>
115      </h4>
116<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
117<span class="keyword">class</span> <span class="identifier">filter_iterator</span>
118<span class="special">{</span>
119 <span class="keyword">public</span><span class="special">:</span>
120    <span class="keyword">typedef</span> <span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
121    <span class="keyword">typedef</span> <span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">reference</span> <span class="identifier">reference</span><span class="special">;</span>
122    <span class="keyword">typedef</span> <span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">pointer</span> <span class="identifier">pointer</span><span class="special">;</span>
123    <span class="keyword">typedef</span> <span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">difference_type</span> <span class="identifier">difference_type</span><span class="special">;</span>
124    <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">iterator_category</span><span class="special">;</span>
125
126    <span class="identifier">filter_iterator</span><span class="special">();</span>
127    <span class="identifier">filter_iterator</span><span class="special">(</span><span class="identifier">Predicate</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">end</span> <span class="special">=</span> <span class="identifier">Iterator</span><span class="special">());</span>
128    <span class="identifier">filter_iterator</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">end</span> <span class="special">=</span> <span class="identifier">Iterator</span><span class="special">());</span>
129    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherIterator</span><span class="special">&gt;</span>
130    <span class="identifier">filter_iterator</span><span class="special">(</span>
131        <span class="identifier">filter_iterator</span><span class="special">&lt;</span><span class="identifier">Predicate</span><span class="special">,</span> <span class="identifier">OtherIterator</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">t</span>
132        <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">enable_if_convertible</span><span class="special">&lt;</span><span class="identifier">OtherIterator</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">*</span> <span class="special">=</span> <span class="number">0</span> <span class="comment">// exposition</span>
133        <span class="special">);</span>
134    <span class="identifier">Predicate</span> <span class="identifier">predicate</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
135    <span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
136    <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">base</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
137    <span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
138    <span class="identifier">filter_iterator</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++();</span>
139<span class="keyword">private</span><span class="special">:</span>
140    <span class="identifier">Predicate</span> <span class="identifier">m_pred</span><span class="special">;</span> <span class="comment">// exposition only</span>
141    <span class="identifier">Iterator</span> <span class="identifier">m_iter</span><span class="special">;</span>  <span class="comment">// exposition only</span>
142    <span class="identifier">Iterator</span> <span class="identifier">m_end</span><span class="special">;</span>   <span class="comment">// exposition only</span>
143<span class="special">};</span>
144</pre>
145<p>
146        If <code class="computeroutput"><span class="identifier">Iterator</span></code> models Readable
147        Lvalue Iterator and Bidirectional Traversal Iterator then <code class="computeroutput"><span class="identifier">iterator_category</span></code>
148        is convertible to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bidirectional_iterator_tag</span></code>. Otherwise,
149        if <code class="computeroutput"><span class="identifier">Iterator</span></code> models Readable
150        Lvalue Iterator and Forward Traversal Iterator then <code class="computeroutput"><span class="identifier">iterator_category</span></code>
151        is convertible to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward_iterator_tag</span></code>. Otherwise <code class="computeroutput"><span class="identifier">iterator_category</span></code> is convertible to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">input_iterator_tag</span></code>.
152      </p>
153<h4>
154<a name="iterator.specialized.filter.h3"></a>
155        <span class="phrase"><a name="iterator.specialized.filter.requirements"></a></span><a class="link" href="filter.html#iterator.specialized.filter.requirements">Requirements</a>
156      </h4>
157<p>
158        The <code class="computeroutput"><span class="identifier">Iterator</span></code> argument shall
159        meet the requirements of Readable Iterator and Single Pass Iterator or it
160        shall meet the requirements of Input Iterator.
161      </p>
162<p>
163        The <code class="computeroutput"><span class="identifier">Predicate</span></code> argument must
164        be Assignable, Copy Constructible, and the expression <code class="computeroutput"><span class="identifier">p</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code>
165        must be valid where <code class="computeroutput"><span class="identifier">p</span></code> is
166        an object of type <code class="computeroutput"><span class="identifier">Predicate</span></code>,
167        <code class="computeroutput"><span class="identifier">x</span></code> is an object of type <code class="computeroutput"><span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">value_type</span></code>, and where the type of <code class="computeroutput"><span class="identifier">p</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code> must be convertible to <code class="computeroutput"><span class="keyword">bool</span></code>.
168      </p>
169<h4>
170<a name="iterator.specialized.filter.h4"></a>
171        <span class="phrase"><a name="iterator.specialized.filter.concepts"></a></span><a class="link" href="filter.html#iterator.specialized.filter.concepts">Concepts</a>
172      </h4>
173<p>
174        The concepts that <code class="computeroutput"><span class="identifier">filter_iterator</span></code>
175        models are dependent on which concepts the <code class="computeroutput"><span class="identifier">Iterator</span></code>
176        argument models, as specified in the following tables.
177      </p>
178<div class="table">
179<a name="iterator.specialized.filter.traversal"></a><p class="title"><b>Table 1.12. Traversal</b></p>
180<div class="table-contents"><table class="table" summary="Traversal">
181<colgroup>
182<col>
183<col>
184</colgroup>
185<thead><tr>
186<th>
187                <p>
188                  If <code class="computeroutput"><span class="identifier">Iterator</span></code> models
189                </p>
190              </th>
191<th>
192                <p>
193                  then <code class="computeroutput"><span class="identifier">filter_iterator</span></code>
194                  models
195                </p>
196              </th>
197</tr></thead>
198<tbody>
199<tr>
200<td>
201                <p>
202                  Single Pass Iterator
203                </p>
204              </td>
205<td>
206                <p>
207                  Single Pass Iterator
208                </p>
209              </td>
210</tr>
211<tr>
212<td>
213                <p>
214                  Forward Traversal Iterator
215                </p>
216              </td>
217<td>
218                <p>
219                  Forward Traversal Iterator
220                </p>
221              </td>
222</tr>
223<tr>
224<td>
225                <p>
226                  Bidirectional Traversal Iterator
227                </p>
228              </td>
229<td>
230                <p>
231                  Bidirectional Traversal Iterator
232                </p>
233              </td>
234</tr>
235</tbody>
236</table></div>
237</div>
238<br class="table-break"><div class="table">
239<a name="iterator.specialized.filter.access"></a><p class="title"><b>Table 1.13. Access</b></p>
240<div class="table-contents"><table class="table" summary="Access">
241<colgroup>
242<col>
243<col>
244</colgroup>
245<thead><tr>
246<th>
247                <p>
248                  If <code class="computeroutput"><span class="identifier">Iterator</span></code> models
249                </p>
250              </th>
251<th>
252                <p>
253                  then <code class="computeroutput"><span class="identifier">filter_iterator</span></code>
254                  models
255                </p>
256              </th>
257</tr></thead>
258<tbody>
259<tr>
260<td>
261                <p>
262                  Readable Iterator
263                </p>
264              </td>
265<td>
266                <p>
267                  Readable Iterator
268                </p>
269              </td>
270</tr>
271<tr>
272<td>
273                <p>
274                  Writable Iterator
275                </p>
276              </td>
277<td>
278                <p>
279                  Writable Iterator
280                </p>
281              </td>
282</tr>
283<tr>
284<td>
285                <p>
286                  Lvalue Iterator
287                </p>
288              </td>
289<td>
290                <p>
291                  Lvalue Iterator
292                </p>
293              </td>
294</tr>
295</tbody>
296</table></div>
297</div>
298<br class="table-break"><div class="table">
299<a name="iterator.specialized.filter.c_03"></a><p class="title"><b>Table 1.14. C++03</b></p>
300<div class="table-contents"><table class="table" summary="C++03">
301<colgroup>
302<col>
303<col>
304</colgroup>
305<thead><tr>
306<th>
307                <p>
308                  If <code class="computeroutput"><span class="identifier">Iterator</span></code> models
309                </p>
310              </th>
311<th>
312                <p>
313                  then <code class="computeroutput"><span class="identifier">filter_iterator</span></code>
314                  models
315                </p>
316              </th>
317</tr></thead>
318<tbody>
319<tr>
320<td>
321                <p>
322                  Readable Iterator, Single Pass Iterator
323                </p>
324              </td>
325<td>
326                <p>
327                  Input Iterator
328                </p>
329              </td>
330</tr>
331<tr>
332<td>
333                <p>
334                  Readable Lvalue Iterator, Forward Traversal Iterator
335                </p>
336              </td>
337<td>
338                <p>
339                  Forward Iterator
340                </p>
341              </td>
342</tr>
343<tr>
344<td>
345                <p>
346                  Writable Lvalue Iterator, Forward Traversal Iterator
347                </p>
348              </td>
349<td>
350                <p>
351                  Mutable Forward Iterator
352                </p>
353              </td>
354</tr>
355<tr>
356<td>
357                <p>
358                  Writable Lvalue Iterator, Bidirectional Iterator
359                </p>
360              </td>
361<td>
362                <p>
363                  Mutable Bidirectional Iterator
364                </p>
365              </td>
366</tr>
367</tbody>
368</table></div>
369</div>
370<br class="table-break"><p>
371        <code class="computeroutput"><span class="identifier">filter_iterator</span><span class="special">&lt;</span><span class="identifier">P1</span><span class="special">,</span> <span class="identifier">X</span><span class="special">&gt;</span></code> is interoperable with <code class="computeroutput"><span class="identifier">filter_iterator</span><span class="special">&lt;</span><span class="identifier">P2</span><span class="special">,</span> <span class="identifier">Y</span><span class="special">&gt;</span></code>
372        if and only if <code class="computeroutput"><span class="identifier">X</span></code> is interoperable
373        with <code class="computeroutput"><span class="identifier">Y</span></code>.
374      </p>
375<h4>
376<a name="iterator.specialized.filter.h5"></a>
377        <span class="phrase"><a name="iterator.specialized.filter.operations"></a></span><a class="link" href="filter.html#iterator.specialized.filter.operations">Operations</a>
378      </h4>
379<p>
380        In addition to those operations required by the concepts that <code class="computeroutput"><span class="identifier">filter_iterator</span></code> models, <code class="computeroutput"><span class="identifier">filter_iterator</span></code>
381        provides the following operations.
382      </p>
383<pre class="programlisting"><span class="identifier">filter_iterator</span><span class="special">();</span>
384</pre>
385<p>
386        <span class="bold"><strong>Requires: </strong></span><code class="computeroutput"><span class="identifier">Predicate</span></code>
387        and <code class="computeroutput"><span class="identifier">Iterator</span></code> must be Default
388        Constructible.<br> <span class="bold"><strong>Effects: </strong></span> Constructs
389        a <code class="computeroutput"><span class="identifier">filter_iterator</span></code> whose<code class="computeroutput"><span class="identifier">m_pred</span></code>, <code class="computeroutput"><span class="identifier">m_iter</span></code>,
390        and <code class="computeroutput"><span class="identifier">m_end</span></code> members are a default
391        constructed.
392      </p>
393<pre class="programlisting"><span class="identifier">filter_iterator</span><span class="special">(</span><span class="identifier">Predicate</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">end</span> <span class="special">=</span> <span class="identifier">Iterator</span><span class="special">());</span>
394</pre>
395<p>
396        <span class="bold"><strong>Effects: </strong></span> Constructs a <code class="computeroutput"><span class="identifier">filter_iterator</span></code>
397        where <code class="computeroutput"><span class="identifier">m_iter</span></code> is either the
398        first position in the range <code class="computeroutput"><span class="special">[</span><span class="identifier">x</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> such that <code class="computeroutput"><span class="identifier">f</span><span class="special">(*</span><span class="identifier">m_iter</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">true</span></code>
399        or else<code class="computeroutput"><span class="identifier">m_iter</span> <span class="special">==</span>
400        <span class="identifier">end</span></code>. The member <code class="computeroutput"><span class="identifier">m_pred</span></code>
401        is constructed from <code class="computeroutput"><span class="identifier">f</span></code> and
402        <code class="computeroutput"><span class="identifier">m_end</span></code> from <code class="computeroutput"><span class="identifier">end</span></code>.
403      </p>
404<pre class="programlisting"><span class="identifier">filter_iterator</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">end</span> <span class="special">=</span> <span class="identifier">Iterator</span><span class="special">());</span>
405</pre>
406<p>
407        <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="identifier">Predicate</span></code>
408        must be Default Constructible and <code class="computeroutput"><span class="identifier">Predicate</span></code>
409        is a class type (not a function pointer).<br> <span class="bold"><strong>Effects:
410        </strong></span> Constructs a <code class="computeroutput"><span class="identifier">filter_iterator</span></code>
411        where <code class="computeroutput"><span class="identifier">m_iter</span></code> is either the
412        first position in the range <code class="computeroutput"><span class="special">[</span><span class="identifier">x</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> such that <code class="computeroutput"><span class="identifier">m_pred</span><span class="special">(*</span><span class="identifier">m_iter</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">true</span></code>
413        or else<code class="computeroutput"><span class="identifier">m_iter</span> <span class="special">==</span>
414        <span class="identifier">end</span></code>. The member <code class="computeroutput"><span class="identifier">m_pred</span></code>
415        is default constructed.
416      </p>
417<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherIterator</span><span class="special">&gt;</span>
418<span class="identifier">filter_iterator</span><span class="special">(</span>
419    <span class="identifier">filter_iterator</span><span class="special">&lt;</span><span class="identifier">Predicate</span><span class="special">,</span> <span class="identifier">OtherIterator</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">t</span>
420    <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">enable_if_convertible</span><span class="special">&lt;</span><span class="identifier">OtherIterator</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">*</span> <span class="special">=</span> <span class="number">0</span> <span class="comment">// exposition</span>
421    <span class="special">);</span>
422</pre>
423<p>
424        <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="identifier">OtherIterator</span></code>
425        is implicitly convertible to <code class="computeroutput"><span class="identifier">Iterator</span></code>.<br>
426        <span class="bold"><strong>Effects: </strong></span> Constructs a filter iterator whose
427        members are copied from <code class="computeroutput"><span class="identifier">t</span></code>.
428      </p>
429<pre class="programlisting"><span class="identifier">Predicate</span> <span class="identifier">predicate</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
430</pre>
431<p>
432        <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">m_pred</span></code>
433      </p>
434<pre class="programlisting"><span class="identifier">Ierator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
435</pre>
436<p>
437        <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">m_end</span></code>
438      </p>
439<pre class="programlisting"><span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">base</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
440</pre>
441<p>
442        <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">m_iterator</span></code>
443      </p>
444<pre class="programlisting"><span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
445</pre>
446<p>
447        <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="identifier">m_iter</span></code>
448      </p>
449<pre class="programlisting"><span class="identifier">filter_iterator</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++();</span>
450</pre>
451<p>
452        <span class="bold"><strong>Effects: </strong></span> Increments <code class="computeroutput"><span class="identifier">m_iter</span></code>
453        and then continues to increment <code class="computeroutput"><span class="identifier">m_iter</span></code>
454        until either <code class="computeroutput"><span class="identifier">m_iter</span> <span class="special">==</span>
455        <span class="identifier">m_end</span></code> or <code class="computeroutput"><span class="identifier">m_pred</span><span class="special">(*</span><span class="identifier">m_iter</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">true</span></code>.<br>
456        <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
457      </p>
458</div>
459<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
460<td align="left"></td>
461<td align="right"><div class="copyright-footer">Copyright © 2003, 2005 David Abrahams Jeremy Siek Thomas
462      Witt<p>
463        Distributed under the Boost Software License, Version 1.0. (See accompanying
464        file LICENSE_1_0.txt or copy at &lt;ulink url="http://www.boost.org/LICENSE_1_0.txt"&gt;
465        http://www.boost.org/LICENSE_1_0.txt &lt;/ulink&gt;)
466      </p>
467</div></td>
468</tr></table>
469<hr>
470<div class="spirit-nav">
471<a accesskey="p" href="../specialized.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../specialized.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="function_output.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
472</div>
473</body>
474</html>
475