1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Move inserters</title> 6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="../move.html" title="Chapter 25. Boost.Move"> 10<link rel="prev" href="move_iterator.html" title="Move iterators"> 11<link rel="next" href="move_algorithms.html" title="Move algorithms"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> 16<td align="center"><a href="../../../index.html">Home</a></td> 17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="move_iterator.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../move.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="move_algorithms.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="section"> 27<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 28<a name="move.move_inserters"></a><a class="link" href="move_inserters.html" title="Move inserters">Move inserters</a> 29</h2></div></div></div> 30<p> 31 Similar to standard insert iterators, it's possible to deal with move insertion 32 in the same way as writing into an array. A special kind of iterator adaptors, 33 called move insert iterators, are provided with this library. With regular 34 iterator classes, 35 </p> 36<pre class="programlisting"><span class="keyword">while</span> <span class="special">(</span><span class="identifier">first</span> <span class="special">!=</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">*</span><span class="identifier">result</span><span class="special">++</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">first</span><span class="special">++;</span> 37</pre> 38<p> 39 causes a range [first,last) to be copied into a range starting with result. 40 The same code with result being a move insert iterator will move insert corresponding 41 elements into the container. This device allows all of the copying algorithms 42 in the library to work in the move insert mode instead of the regular overwrite 43 mode. This library offers 3 move insert iterators and their helper functions: 44 </p> 45<pre class="programlisting"><span class="comment">// Note: C models Container</span> 46<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span> 47<span class="keyword">class</span> <span class="identifier">back_move_insert_iterator</span><span class="special">;</span> 48 49<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span> 50<span class="identifier">back_move_insert_iterator</span><span class="special"><</span><span class="identifier">C</span><span class="special">></span> <span class="identifier">back_move_inserter</span><span class="special">(</span><span class="identifier">C</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 51 52<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span> 53<span class="keyword">class</span> <span class="identifier">front_move_insert_iterator</span><span class="special">;</span> 54 55<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span> 56<span class="identifier">front_move_insert_iterator</span><span class="special"><</span><span class="identifier">C</span><span class="special">></span> <span class="identifier">front_move_inserter</span><span class="special">(</span><span class="identifier">C</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> 57 58<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span> 59<span class="keyword">class</span> <span class="identifier">move_insert_iterator</span><span class="special">;</span> 60 61<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span> 62<span class="identifier">move_insert_iterator</span><span class="special"><</span><span class="identifier">C</span><span class="special">></span> <span class="identifier">move_inserter</span><span class="special">(</span><span class="identifier">C</span><span class="special">&</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">it</span><span class="special">);</span> 63</pre> 64<p> 65 A move insert iterator is constructed from a container and possibly one of 66 its iterators pointing to where insertion takes place if it is neither at the 67 beginning nor at the end of the container. Insert iterators satisfy the requirements 68 of output iterators. <code class="computeroutput"><span class="keyword">operator</span><span class="special">*</span></code> returns the move insert iterator itself. The 69 assignment <code class="computeroutput"><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&</span> <span class="identifier">x</span><span class="special">)</span></code> is defined on insert iterators to allow writing 70 into them, it inserts x right before where the insert iterator is pointing. 71 In other words, an <code class="computeroutput"><span class="identifier">insert</span> <span class="identifier">iterator</span></code> is like a cursor pointing into the 72 container where the insertion takes place. <code class="computeroutput"><span class="identifier">back_move_iterator</span></code> 73 move inserts elements at the end of a container, <code class="computeroutput"><span class="identifier">front_insert_iterator</span></code> 74 move inserts elements at the beginning of a container, and <code class="computeroutput"><span class="identifier">move_insert_iterator</span></code> 75 move inserts elements where the iterator points to in a container. <code class="computeroutput"><span class="identifier">back_move_inserter</span></code>, <code class="computeroutput"><span class="identifier">front_move_inserter</span></code>, 76 and <code class="computeroutput"><span class="identifier">move_inserter</span></code> are three 77 functions making the insert iterators out of a container. Here's an example 78 of how to use them: 79 </p> 80<p> 81</p> 82<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">container</span><span class="special">/</span><span class="identifier">list</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 83<span class="preprocessor">#include</span> <span class="string">"movable.hpp"</span> 84<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 85<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> 86 87<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">container</span><span class="special">;</span> 88 89<span class="keyword">typedef</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">movable</span><span class="special">></span> <span class="identifier">list_t</span><span class="special">;</span> 90<span class="keyword">typedef</span> <span class="identifier">list_t</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">l_iterator</span><span class="special">;</span> 91 92<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">MoveInsertIterator</span><span class="special">></span> 93<span class="keyword">void</span> <span class="identifier">test_move_inserter</span><span class="special">(</span><span class="identifier">list_t</span> <span class="special">&</span><span class="identifier">l2</span><span class="special">,</span> <span class="identifier">MoveInsertIterator</span> <span class="identifier">mit</span><span class="special">)</span> 94<span class="special">{</span> 95 <span class="comment">//Create a list with 10 default constructed objects</span> 96 <span class="identifier">list</span><span class="special"><</span><span class="identifier">movable</span><span class="special">></span> <span class="identifier">l</span><span class="special">(</span><span class="number">10</span><span class="special">);</span> 97 <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">l</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()-></span><span class="identifier">moved</span><span class="special">());</span> 98 <span class="identifier">l2</span><span class="special">.</span><span class="identifier">clear</span><span class="special">();</span> 99 100 <span class="comment">//Move insert into l2 containers</span> 101 <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">l</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">l</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">mit</span><span class="special">);</span> 102 103 <span class="comment">//Check size and status</span> 104 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">l2</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">l</span><span class="special">.</span><span class="identifier">size</span><span class="special">());</span> 105 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">l</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()-></span><span class="identifier">moved</span><span class="special">());</span> 106 <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">l2</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()-></span><span class="identifier">moved</span><span class="special">());</span> 107<span class="special">}</span> 108 109<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 110<span class="special">{</span> 111 <span class="identifier">list_t</span> <span class="identifier">l2</span><span class="special">;</span> 112 <span class="identifier">test_move_inserter</span><span class="special">(</span><span class="identifier">l2</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">back_move_inserter</span><span class="special">(</span><span class="identifier">l2</span><span class="special">));</span> 113 <span class="identifier">test_move_inserter</span><span class="special">(</span><span class="identifier">l2</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">front_move_inserter</span><span class="special">(</span><span class="identifier">l2</span><span class="special">));</span> 114 <span class="identifier">test_move_inserter</span><span class="special">(</span><span class="identifier">l2</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move_inserter</span><span class="special">(</span><span class="identifier">l2</span><span class="special">,</span> <span class="identifier">l2</span><span class="special">.</span><span class="identifier">end</span><span class="special">()));</span> 115 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 116<span class="special">}</span> 117</pre> 118<p> 119 </p> 120</div> 121<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 122<td align="left"></td> 123<td align="right"><div class="copyright-footer">Copyright © 2008-2014 Ion Gaztanaga<p> 124 Distributed under the Boost Software License, Version 1.0. (See accompanying 125 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 126 </p> 127</div></td> 128</tr></table> 129<hr> 130<div class="spirit-nav"> 131<a accesskey="p" href="move_iterator.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../move.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="move_algorithms.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 132</div> 133</body> 134</html> 135