1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Shared Container 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="reverse.html" title="Reverse Iterator"> 10<link rel="next" href="transform.html" title="Transform 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="reverse.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="transform.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.shared_container"></a><a class="link" href="shared_container.html" title="Shared Container Iterator">Shared Container 28 Iterator</a> 29</h3></div></div></div> 30<div class="toc"><dl class="toc"> 31<dt><span class="section"><a href="shared_container.html#iterator.specialized.shared_container.shared_container_type">The 32 Shared Container Iterator Type</a></span></dt> 33<dt><span class="section"><a href="shared_container.html#iterator.specialized.shared_container.shared_container_object_generator">The 34 Shared Container Iterator Object Generator</a></span></dt> 35<dt><span class="section"><a href="shared_container.html#iterator.specialized.shared_container.shared_container_generator">The 36 Shared Container Iterator Range Generator</a></span></dt> 37</dl></div> 38<p> 39 Defined in header <a href="../../../../../boost/shared_container_iterator.hpp" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">/</span><span class="identifier">shared_container_iterator</span><span class="special">.</span><span class="identifier">hpp</span></code></a>. 40 </p> 41<p> 42 The purpose of the shared container iterator is to attach the lifetime of 43 a container to the lifetime of its iterators. In other words, the container 44 will not be deleted until after all its iterators are destroyed. The shared 45 container iterator is typically used to implement functions that return iterators 46 over a range of objects that only need to exist for the lifetime of the iterators. 47 By returning a pair of shared iterators from a function, the callee can return 48 a heap-allocated range of objects whose lifetime is automatically managed. 49 </p> 50<p> 51 The shared container iterator augments an iterator over a shared container. 52 It maintains a reference count on the shared container. If only shared container 53 iterators hold references to the container, the container's lifetime will 54 end when the last shared container iterator over it is destroyed. In any 55 case, the shared container is guaranteed to persist beyond the lifetime of 56 all the iterators. In all other ways, the shared container iterator behaves 57 the same as its base iterator. 58 </p> 59<h3> 60<a name="iterator.specialized.shared_container.h0"></a> 61 <span class="phrase"><a name="iterator.specialized.shared_container.synopsis"></a></span><a class="link" href="shared_container.html#iterator.specialized.shared_container.synopsis">Synopsis</a> 62 </h3> 63<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 64 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> 65 <span class="keyword">class</span> <span class="identifier">shared_container_iterator</span><span class="special">;</span> 66 67 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> 68 <span class="identifier">shared_container_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> 69 <span class="identifier">make_shared_container_iterator</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">base</span><span class="special">,</span> 70 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">container</span><span class="special">);</span> 71 72 <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span> 73 <span class="keyword">typename</span> <span class="identifier">shared_container_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">>,</span> 74 <span class="keyword">typename</span> <span class="identifier">shared_container_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> 75 <span class="special">></span> 76 <span class="identifier">make_shared_container_range</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">container</span><span class="special">);</span> 77<span class="special">}</span> 78</pre> 79<div class="section"> 80<div class="titlepage"><div><div><h4 class="title"> 81<a name="iterator.specialized.shared_container.shared_container_type"></a><a class="link" href="shared_container.html#iterator.specialized.shared_container.shared_container_type" title="The Shared Container Iterator Type">The 82 Shared Container Iterator Type</a> 83</h4></div></div></div> 84<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> <span class="keyword">class</span> <span class="identifier">shared_container_iterator</span><span class="special">;</span> 85</pre> 86<p> 87 The class template <code class="computeroutput"><span class="identifier">shared_container_iterator</span></code> 88 is the shared container iterator type. The <code class="computeroutput"><span class="identifier">Container</span></code> 89 template type argument must model the <a href="http://www.sgi.com/tech/stl/Container.html" target="_top">Container</a> 90 concept. 91 </p> 92<h3> 93<a name="iterator.specialized.shared_container.shared_container_type.h0"></a> 94 <span class="phrase"><a name="iterator.specialized.shared_container.shared_container_type.example"></a></span><a class="link" href="shared_container.html#iterator.specialized.shared_container.shared_container_type.example">Example</a> 95 </h3> 96<p> 97 The following example illustrates how to create an iterator that regulates 98 the lifetime of a reference counted <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>. 99 Though the original shared pointer <code class="computeroutput"><span class="identifier">ints</span></code> 100 ceases to exist after <code class="computeroutput"><span class="identifier">set_range</span><span class="special">()</span></code> returns, the <code class="computeroutput"><span class="identifier">shared_counter_iterator</span></code> 101 objects maintain references to the underlying vector and thereby extend 102 the container's lifetime. 103 </p> 104<p> 105 <a href="../../../../example/shared_iterator_example1.cpp" target="_top"><code class="computeroutput"><span class="identifier">shared_iterator_example1</span><span class="special">.</span><span class="identifier">cpp</span></code></a>: 106 </p> 107<pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"shared_container_iterator.hpp"</span> 108<span class="preprocessor">#include</span> <span class="string">"boost/shared_ptr.hpp"</span> 109<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> 110<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 111<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span> 112 113<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_container_iterator</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span> <span class="identifier">iterator</span><span class="special">;</span> 114 115 116<span class="keyword">void</span> <span class="identifier">set_range</span><span class="special">(</span><span class="identifier">iterator</span><span class="special">&</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">iterator</span><span class="special">&</span> <span class="identifier">end</span><span class="special">)</span> <span class="special">{</span> 117 118 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span> <span class="identifier">ints</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>());</span> 119 120 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 121 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> 122 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> 123 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">3</span><span class="special">);</span> 124 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">4</span><span class="special">);</span> 125 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">5</span><span class="special">);</span> 126 127 <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">iterator</span><span class="special">(</span><span class="identifier">ints</span><span class="special">-></span><span class="identifier">begin</span><span class="special">(),</span><span class="identifier">ints</span><span class="special">);</span> 128 <span class="identifier">end</span> <span class="special">=</span> <span class="identifier">iterator</span><span class="special">(</span><span class="identifier">ints</span><span class="special">-></span><span class="identifier">end</span><span class="special">(),</span><span class="identifier">ints</span><span class="special">);</span> 129<span class="special">}</span> 130 131 132<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 133 134 <span class="identifier">iterator</span> <span class="identifier">i</span><span class="special">,</span><span class="identifier">end</span><span class="special">;</span> 135 136 <span class="identifier">set_range</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span><span class="identifier">end</span><span class="special">);</span> 137 138 <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span><span class="identifier">end</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> 139 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="char">'\n'</span><span class="special">);</span> 140 141 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 142<span class="special">}</span> 143</pre> 144<p> 145 The output from this part is: 146 </p> 147<pre class="programlisting">0,1,2,3,4,5, 148</pre> 149<div class="table"> 150<a name="iterator.specialized.shared_container.shared_container_type.template_parameters"></a><p class="title"><b>Table 1.16. Template Parameters</b></p> 151<div class="table-contents"><table class="table" summary="Template Parameters"> 152<colgroup> 153<col> 154<col> 155</colgroup> 156<thead><tr> 157<th> 158 <p> 159 Parameter 160 </p> 161 </th> 162<th> 163 <p> 164 Description 165 </p> 166 </th> 167</tr></thead> 168<tbody><tr> 169<td> 170 <p> 171 Container 172 </p> 173 </td> 174<td> 175 <p> 176 The type of the container that we wish to iterate over. It must 177 be a model of the Container concept. 178 </p> 179 </td> 180</tr></tbody> 181</table></div> 182</div> 183<br class="table-break"><h3> 184<a name="iterator.specialized.shared_container.shared_container_type.h1"></a> 185 <span class="phrase"><a name="iterator.specialized.shared_container.shared_container_type.concepts"></a></span><a class="link" href="shared_container.html#iterator.specialized.shared_container.shared_container_type.concepts">Concepts</a> 186 </h3> 187<p> 188 The <code class="computeroutput"><span class="identifier">shared_container_iterator</span></code> 189 type models the same iterator concept as the base iterator (<code class="computeroutput"><span class="identifier">Container</span><span class="special">::</span><span class="identifier">iterator</span></code>). 190 </p> 191<h3> 192<a name="iterator.specialized.shared_container.shared_container_type.h2"></a> 193 <span class="phrase"><a name="iterator.specialized.shared_container.shared_container_type.operations"></a></span><a class="link" href="shared_container.html#iterator.specialized.shared_container.shared_container_type.operations">Operations</a> 194 </h3> 195<p> 196 The <code class="computeroutput"><span class="identifier">shared_container_iterator</span></code> 197 type implements the member functions and operators required of the <a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html" target="_top">Random Access 198 Iterator</a> concept, though only operations defined for the base iterator 199 will be valid. In addition it has the following constructor: 200 </p> 201<pre class="programlisting"><span class="identifier">shared_container_iterator</span><span class="special">(</span><span class="identifier">Container</span><span class="special">::</span><span class="identifier">iterator</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">it</span><span class="special">,</span> 202 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">container</span><span class="special">)</span> 203</pre> 204</div> 205<div class="section"> 206<div class="titlepage"><div><div><h4 class="title"> 207<a name="iterator.specialized.shared_container.shared_container_object_generator"></a><a class="link" href="shared_container.html#iterator.specialized.shared_container.shared_container_object_generator" title="The Shared Container Iterator Object Generator">The 208 Shared Container Iterator Object Generator</a> 209</h4></div></div></div> 210<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> 211<span class="identifier">shared_container_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> 212<span class="identifier">make_shared_container_iterator</span><span class="special">(</span><span class="identifier">Container</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">base</span><span class="special">,</span> 213 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">container</span><span class="special">)</span> 214</pre> 215<p> 216 This function provides an alternative to directly constructing a <code class="computeroutput"><span class="identifier">shared_container_iterator</span></code>. Using the 217 object generator, a <code class="computeroutput"><span class="identifier">shared_container_iterator</span></code> 218 can be created and passed to a function without explicitly specifying its 219 type. 220 </p> 221<h3> 222<a name="iterator.specialized.shared_container.shared_container_object_generator.h0"></a> 223 <span class="phrase"><a name="iterator.specialized.shared_container.shared_container_object_generator.example"></a></span><a class="link" href="shared_container.html#iterator.specialized.shared_container.shared_container_object_generator.example">Example</a> 224 </h3> 225<p> 226 This example, similar to the previous, uses <code class="computeroutput"><span class="identifier">make_shared_container_iterator</span><span class="special">()</span></code> to create the iterators. 227 </p> 228<p> 229 <a href="../../../../example/shared_iterator_example2.cpp" target="_top"><code class="computeroutput"><span class="identifier">shared_iterator_example2</span><span class="special">.</span><span class="identifier">cpp</span></code></a>: 230 </p> 231<pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"shared_container_iterator.hpp"</span> 232<span class="preprocessor">#include</span> <span class="string">"boost/shared_ptr.hpp"</span> 233<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> 234<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iterator</span><span class="special">></span> 235<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 236<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span> 237 238 239<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span> 240<span class="keyword">void</span> <span class="identifier">print_range_nl</span> <span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">)</span> <span class="special">{</span> 241 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</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">val</span><span class="special">;</span> 242 <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</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="identifier">val</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> 243 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="char">'\n'</span><span class="special">);</span> 244<span class="special">}</span> 245 246 247<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 248 249 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span> <span class="identifier">ints_t</span><span class="special">;</span> 250 <span class="special">{</span> 251 <span class="identifier">ints_t</span> <span class="identifier">ints</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>());</span> 252 253 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 254 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> 255 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> 256 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">3</span><span class="special">);</span> 257 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">4</span><span class="special">);</span> 258 <span class="identifier">ints</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">5</span><span class="special">);</span> 259 260 <span class="identifier">print_range_nl</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_shared_container_iterator</span><span class="special">(</span><span class="identifier">ints</span><span class="special">-></span><span class="identifier">begin</span><span class="special">(),</span><span class="identifier">ints</span><span class="special">),</span> 261 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_shared_container_iterator</span><span class="special">(</span><span class="identifier">ints</span><span class="special">-></span><span class="identifier">end</span><span class="special">(),</span><span class="identifier">ints</span><span class="special">));</span> 262 <span class="special">}</span> 263 264 265 266 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 267<span class="special">}</span> 268</pre> 269<p> 270 Observe that the <code class="computeroutput"><span class="identifier">shared_container_iterator</span></code> 271 type is never explicitly named. The output from this example is the same 272 as the previous. 273 </p> 274</div> 275<div class="section"> 276<div class="titlepage"><div><div><h4 class="title"> 277<a name="iterator.specialized.shared_container.shared_container_generator"></a><a class="link" href="shared_container.html#iterator.specialized.shared_container.shared_container_generator" title="The Shared Container Iterator Range Generator">The 278 Shared Container Iterator Range Generator</a> 279</h4></div></div></div> 280<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> 281<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span> 282 <span class="identifier">shared_container_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">>,</span> 283 <span class="identifier">shared_container_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> 284<span class="special">></span> 285<span class="identifier">make_shared_container_range</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">container</span><span class="special">);</span> 286<span class="identifier">Class</span> <span class="identifier">shared_container_iterator</span> <span class="identifier">is</span> <span class="identifier">meant</span> <span class="identifier">primarily</span> <span class="identifier">to</span> <span class="keyword">return</span><span class="special">,</span> <span class="keyword">using</span> <span class="identifier">iterators</span><span class="special">,</span> <span class="identifier">a</span> <span class="identifier">range</span> <span class="identifier">of</span> <span class="identifier">values</span> <span class="identifier">that</span> <span class="identifier">we</span> <span class="identifier">can</span> <span class="identifier">guarantee</span> <span class="identifier">will</span> <span class="identifier">be</span> <span class="identifier">alive</span> <span class="identifier">as</span> <span class="keyword">long</span> <span class="identifier">as</span> <span class="identifier">the</span> <span class="identifier">iterators</span> <span class="identifier">are</span><span class="special">.</span> <span class="identifier">This</span> <span class="identifier">is</span> <span class="identifier">a</span> <span class="identifier">convenience</span> <span class="identifier">function</span> <span class="identifier">to</span> <span class="keyword">do</span> <span class="identifier">just</span> <span class="identifier">that</span><span class="special">.</span> <span class="identifier">It</span> <span class="identifier">is</span> <span class="identifier">equivalent</span> <span class="identifier">to</span> 287<span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">make_shared_container_iterator</span><span class="special">(</span><span class="identifier">container</span><span class="special">-></span><span class="identifier">begin</span><span class="special">(),</span><span class="identifier">container</span><span class="special">),</span> 288 <span class="identifier">make_shared_container_iterator</span><span class="special">(</span><span class="identifier">container</span><span class="special">-></span><span class="identifier">end</span><span class="special">(),</span><span class="identifier">container</span><span class="special">));</span> 289</pre> 290<h3> 291<a name="iterator.specialized.shared_container.shared_container_generator.h0"></a> 292 <span class="phrase"><a name="iterator.specialized.shared_container.shared_container_generator.example"></a></span><a class="link" href="shared_container.html#iterator.specialized.shared_container.shared_container_generator.example">Example</a> 293 </h3> 294<p> 295 In the following example, a range of values is returned as a pair of shared_container_iterator 296 objects. 297 </p> 298<p> 299 <a href="../../../../example/shared_iterator_example3.cpp" target="_top"><code class="computeroutput"><span class="identifier">shared_iterator_example3</span><span class="special">.</span><span class="identifier">cpp</span></code></a>: 300 </p> 301<pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"shared_container_iterator.hpp"</span> 302<span class="preprocessor">#include</span> <span class="string">"boost/shared_ptr.hpp"</span> 303<span class="preprocessor">#include</span> <span class="string">"boost/tuple/tuple.hpp"</span> <span class="comment">// for boost::tie</span> 304<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> <span class="comment">// for std::copy</span> 305<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 306<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span> 307 308 309<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_container_iterator</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span> <span class="identifier">iterator</span><span class="special">;</span> 310 311<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">iterator</span><span class="special">,</span><span class="identifier">iterator</span><span class="special">></span> 312<span class="identifier">return_range</span><span class="special">()</span> <span class="special">{</span> 313 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span> <span class="identifier">range</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>());</span> 314 <span class="identifier">range</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 315 <span class="identifier">range</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> 316 <span class="identifier">range</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> 317 <span class="identifier">range</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">3</span><span class="special">);</span> 318 <span class="identifier">range</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">4</span><span class="special">);</span> 319 <span class="identifier">range</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="number">5</span><span class="special">);</span> 320 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_shared_container_range</span><span class="special">(</span><span class="identifier">range</span><span class="special">);</span> 321<span class="special">}</span> 322 323 324<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 325 326 327 <span class="identifier">iterator</span> <span class="identifier">i</span><span class="special">,</span><span class="identifier">end</span><span class="special">;</span> 328 329 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">return_range</span><span class="special">();</span> 330 331 <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span><span class="identifier">end</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> 332 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="char">'\n'</span><span class="special">);</span> 333 334 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 335<span class="special">}</span> 336</pre> 337<p> 338 Though the range object only lives for the duration of the <code class="computeroutput"><span class="identifier">return_range</span></code> call, the reference counted 339 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code> will live until <code class="computeroutput"><span class="identifier">i</span></code> and <code class="computeroutput"><span class="identifier">end</span></code> 340 are both destroyed. The output from this example is the same as the previous 341 two. 342 </p> 343</div> 344</div> 345<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 346<td align="left"></td> 347<td align="right"><div class="copyright-footer">Copyright © 2003, 2005 David Abrahams Jeremy Siek Thomas 348 Witt<p> 349 Distributed under the Boost Software License, Version 1.0. (See accompanying 350 file LICENSE_1_0.txt or copy at <ulink url="http://www.boost.org/LICENSE_1_0.txt"> 351 http://www.boost.org/LICENSE_1_0.txt </ulink>) 352 </p> 353</div></td> 354</tr></table> 355<hr> 356<div class="spirit-nav"> 357<a accesskey="p" href="reverse.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="transform.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> 358</div> 359</body> 360</html> 361