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"><</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"><</span><span class="identifier">is_positive_number</span><span class="special">,</span> <span class="identifier">base_iterator</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">>(</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"><<</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"><</span><span class="identifier">is_positive_number</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> 76 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special"><</span><span class="identifier">is_positive_number</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> 77 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</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"><<</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"><</span><span class="keyword">int</span><span class="special">>(),</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"><</span><span class="keyword">int</span><span class="special">>(),</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"><</span><span class="keyword">int</span><span class="special">>(</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"><<</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"><</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">></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"><</span><span class="identifier">Iterator</span><span class="special">>::</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"><</span><span class="identifier">Iterator</span><span class="special">>::</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"><</span><span class="identifier">Iterator</span><span class="special">>::</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"><</span><span class="identifier">Iterator</span><span class="special">>::</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"><</span><span class="keyword">class</span> <span class="identifier">OtherIterator</span><span class="special">></span> 130 <span class="identifier">filter_iterator</span><span class="special">(</span> 131 <span class="identifier">filter_iterator</span><span class="special"><</span><span class="identifier">Predicate</span><span class="special">,</span> <span class="identifier">OtherIterator</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</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"><</span><span class="identifier">OtherIterator</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">>::</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">&</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">&</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"><</span><span class="identifier">Iterator</span><span class="special">>::</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"><</span><span class="identifier">P1</span><span class="special">,</span> <span class="identifier">X</span><span class="special">></span></code> is interoperable with <code class="computeroutput"><span class="identifier">filter_iterator</span><span class="special"><</span><span class="identifier">P2</span><span class="special">,</span> <span class="identifier">Y</span><span class="special">></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"><</span><span class="keyword">class</span> <span class="identifier">OtherIterator</span><span class="special">></span> 418<span class="identifier">filter_iterator</span><span class="special">(</span> 419 <span class="identifier">filter_iterator</span><span class="special"><</span><span class="identifier">Predicate</span><span class="special">,</span> <span class="identifier">OtherIterator</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</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"><</span><span class="identifier">OtherIterator</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">>::</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">&</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">&</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 <ulink url="http://www.boost.org/LICENSE_1_0.txt"> 465 http://www.boost.org/LICENSE_1_0.txt </ulink>) 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