• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Creation and Modification</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. Geometry">
8<link rel="up" href="../spatial_indexes.html" title="Spatial Indexes">
9<link rel="prev" href="rtree_quickstart.html" title="Quick Start">
10<link rel="next" href="queries.html" title="Queries">
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="rtree_quickstart.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../spatial_indexes.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="queries.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="geometry.spatial_indexes.creation_and_modification"></a><a class="link" href="creation_and_modification.html" title="Creation and Modification">Creation
28      and Modification</a>
29</h3></div></div></div>
30<h5>
31<a name="geometry.spatial_indexes.creation_and_modification.h0"></a>
32        <span class="phrase"><a name="geometry.spatial_indexes.creation_and_modification.template_parameters"></a></span><a class="link" href="creation_and_modification.html#geometry.spatial_indexes.creation_and_modification.template_parameters">Template
33        parameters</a>
34      </h5>
35<p>
36        R-tree has 5 parameters but only 2 are required:
37      </p>
38<pre class="programlisting"><span class="identifier">rtree</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">,</span>
39      <span class="identifier">Parameters</span><span class="special">,</span>
40      <span class="identifier">IndexableGetter</span> <span class="special">=</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">indexable</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;,</span>
41      <span class="identifier">EqualTo</span> <span class="special">=</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;,</span>
42      <span class="identifier">Allocator</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;</span> <span class="special">&gt;</span>
43</pre>
44<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
45<li class="listitem">
46            <code class="computeroutput">Value</code> - type of object which will be stored in the container,
47          </li>
48<li class="listitem">
49            <code class="computeroutput"><span class="identifier">Parameters</span></code> - parameters
50            type, inserting/splitting algorithm,
51          </li>
52<li class="listitem">
53            <code class="computeroutput"><span class="identifier">IndexableGetter</span></code> - function
54            object translating <code class="computeroutput">Value</code> to <code class="computeroutput">Indexable</code> (<code class="computeroutput">Point</code>
55            or <code class="computeroutput">Box</code>) which R-tree can handle,
56          </li>
57<li class="listitem">
58            <code class="computeroutput"><span class="identifier">EqualTo</span></code> - function object
59            comparing <code class="computeroutput">Value</code>s,
60          </li>
61<li class="listitem">
62            <code class="computeroutput"><span class="identifier">Allocator</span></code> - <code class="computeroutput"><span class="identifier">Value</span></code>s allocator, all allocators needed
63            by the container are created from it.
64          </li>
65</ul></div>
66<h5>
67<a name="geometry.spatial_indexes.creation_and_modification.h1"></a>
68        <span class="phrase"><a name="geometry.spatial_indexes.creation_and_modification.values_and_indexables"></a></span><a class="link" href="creation_and_modification.html#geometry.spatial_indexes.creation_and_modification.values_and_indexables">Values
69        and Indexables</a>
70      </h5>
71<p>
72        R-tree may store <code class="computeroutput">Value</code>s of any type as long as passed function
73        objects know how to interpret those <code class="computeroutput">Value</code>s, that is extract
74        an <code class="computeroutput">Indexable</code> that the R-tree can handle and compare <code class="computeroutput">Value</code>s.
75        The <code class="computeroutput">Indexable</code> is a type adapted to Point, Box or Segment concept.
76        The examples of rtrees storing <code class="computeroutput">Value</code>s translatable to various
77        <code class="computeroutput">Indexable</code>s are presented below.
78      </p>
79<div class="informaltable"><table class="table">
80<colgroup>
81<col>
82<col>
83<col>
84</colgroup>
85<thead><tr>
86<th>
87                <p>
88                  rtree&lt;Point, ...&gt;
89                </p>
90              </th>
91<th>
92                <p>
93                  rtree&lt;Box, ...&gt;
94                </p>
95              </th>
96<th>
97                <p>
98                  rtree&lt;Segment, ...&gt;
99                </p>
100              </th>
101</tr></thead>
102<tbody><tr>
103<td>
104                <p>
105                  <span class="inlinemediaobject"><img src="../../img/index/rtree/rtree_pt.png" alt="rtree_pt"></span>
106                </p>
107              </td>
108<td>
109                <p>
110                  <span class="inlinemediaobject"><img src="../../img/index/rtree/rstar.png" alt="rstar"></span>
111                </p>
112              </td>
113<td>
114                <p>
115                  <span class="inlinemediaobject"><img src="../../img/index/rtree/rtree_seg.png" alt="rtree_seg"></span>
116                </p>
117              </td>
118</tr></tbody>
119</table></div>
120<p>
121        By default function objects <code class="computeroutput"><span class="identifier">index</span><span class="special">::</span><span class="identifier">indexable</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;</span></code> and <code class="computeroutput"><span class="identifier">index</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;</span></code> are defined for some typically used
122        <code class="computeroutput">Value</code> types which may be stored without defining any additional
123        classes. By default the rtree may store pure <code class="computeroutput">Indexable</code>s, pairs
124        and tuples. In the case of those two collection types, the <code class="computeroutput">Indexable</code>
125        must be the first stored type.
126      </p>
127<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
128<li class="listitem">
129            <code class="computeroutput">Indexable <span class="special">=</span> Point <span class="special">|</span>
130            Box <span class="special">|</span> <span class="identifier">Segment</span></code>
131          </li>
132<li class="listitem">
133            <code class="computeroutput">Value <span class="special">=</span> <span class="identifier">Indexable</span>
134            <span class="special">|</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span>Indexable<span class="special">,</span>
135            <span class="identifier">T</span><span class="special">&gt;</span>
136            <span class="special">|</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span>Indexable<span class="special">,</span>
137            <span class="special">...&gt;</span> <span class="special">[</span>
138            <span class="special">|</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span>Indexable<span class="special">,</span>
139            <span class="special">...&gt;</span> <span class="special">]</span></code>
140          </li>
141</ul></div>
142<p>
143        By default <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;...&gt;</span></code>
144        is supported on all compilers. If the compiler supports C++11 tuples and
145        variadic templates then <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;...&gt;</span></code> may be used "out of the box"
146        as well.
147      </p>
148<p>
149        Examples of default <code class="computeroutput">Value</code> types:
150      </p>
151<pre class="programlisting"><span class="identifier">geometry</span><span class="special">::</span><span class="identifier">model</span><span class="special">::</span><span class="identifier">point</span><span class="special">&lt;...&gt;</span>
152<span class="identifier">geometry</span><span class="special">::</span><span class="identifier">model</span><span class="special">::</span><span class="identifier">point_xy</span><span class="special">&lt;...&gt;</span>
153<span class="identifier">geometry</span><span class="special">::</span><span class="identifier">model</span><span class="special">::</span><span class="identifier">box</span><span class="special">&lt;...&gt;</span>
154<span class="identifier">geometry</span><span class="special">::</span><span class="identifier">model</span><span class="special">::</span><span class="identifier">segment</span><span class="special">&lt;...&gt;</span>
155<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">geometry</span><span class="special">::</span><span class="identifier">model</span><span class="special">::</span><span class="identifier">box</span><span class="special">&lt;...&gt;,</span> <span class="keyword">unsigned</span><span class="special">&gt;</span>
156<span class="identifier">boost</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">geometry</span><span class="special">::</span><span class="identifier">model</span><span class="special">::</span><span class="identifier">point</span><span class="special">&lt;...&gt;,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">float</span><span class="special">&gt;</span>
157</pre>
158<p>
159        The predefined <code class="computeroutput"><span class="identifier">index</span><span class="special">::</span><span class="identifier">indexable</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;</span></code>
160        returns const reference to the <code class="computeroutput">Indexable</code> stored in the <code class="computeroutput">Value</code>.
161      </p>
162<div class="important"><table border="0" summary="Important">
163<tr>
164<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td>
165<th align="left">Important</th>
166</tr>
167<tr><td align="left" valign="top"><p>
168          The translation is done quite frequently inside the container - each time
169          the rtree needs it.
170        </p></td></tr>
171</table></div>
172<p>
173        The predefined <code class="computeroutput"><span class="identifier">index</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;</span></code>:
174      </p>
175<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
176<li class="listitem">
177            for <code class="computeroutput">Point</code>, <code class="computeroutput">Box</code> and <code class="computeroutput"><span class="identifier">Segment</span></code>
178            - compares <code class="computeroutput">Value</code>s with geometry::equals().
179          </li>
180<li class="listitem">
181            for <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;...&gt;</span></code>
182            - compares both components of the <code class="computeroutput">Value</code>. The first value
183            stored in the pair is compared before the second one. If the value stored
184            in the pair is a Geometry, <code class="computeroutput"><span class="identifier">geometry</span><span class="special">::</span><span class="identifier">equals</span><span class="special">()</span></code> is used. For other types it uses <code class="computeroutput"><span class="keyword">operator</span><span class="special">==()</span></code>.
185          </li>
186<li class="listitem">
187            for <code class="computeroutput"><span class="identifier">tuple</span><span class="special">&lt;...&gt;</span></code>
188            - compares all components of the <code class="computeroutput">Value</code>. If the component
189            is a <code class="computeroutput"><span class="identifier">Geometry</span></code>, <code class="computeroutput"><span class="identifier">geometry</span><span class="special">::</span><span class="identifier">equals</span><span class="special">()</span></code>
190            function is used. For other types it uses <code class="computeroutput"><span class="keyword">operator</span><span class="special">==()</span></code>.
191          </li>
192</ul></div>
193<h5>
194<a name="geometry.spatial_indexes.creation_and_modification.h2"></a>
195        <span class="phrase"><a name="geometry.spatial_indexes.creation_and_modification.balancing_algorithms_compile_time_parameters"></a></span><a class="link" href="creation_and_modification.html#geometry.spatial_indexes.creation_and_modification.balancing_algorithms_compile_time_parameters">Balancing
196        algorithms compile-time parameters</a>
197      </h5>
198<p>
199        <code class="computeroutput">Value</code>s may be inserted to the R-tree in many various ways. Final
200        internal structure of the R-tree depends on algorithms used in the insertion
201        process and parameters. The most important is nodes' balancing algorithm.
202        Currently, three well-known types of R-trees may be created.
203      </p>
204<p>
205        Linear - classic R-tree using balancing algorithm of linear complexity
206      </p>
207<pre class="programlisting"><span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span> Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">linear</span><span class="special">&lt;</span><span class="number">16</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">rt</span><span class="special">;</span>
208</pre>
209<p>
210        Quadratic - classic R-tree using balancing algorithm of quadratic complexity
211      </p>
212<pre class="programlisting"><span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span> Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">quadratic</span><span class="special">&lt;</span><span class="number">16</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">rt</span><span class="special">;</span>
213</pre>
214<p>
215        R*-tree - balancing algorithm minimizing nodes' overlap with forced reinsertions
216      </p>
217<pre class="programlisting"><span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span> Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">rstar</span><span class="special">&lt;</span><span class="number">16</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">rt</span><span class="special">;</span>
218</pre>
219<h5>
220<a name="geometry.spatial_indexes.creation_and_modification.h3"></a>
221        <span class="phrase"><a name="geometry.spatial_indexes.creation_and_modification.balancing_algorithms_run_time_parameters"></a></span><a class="link" href="creation_and_modification.html#geometry.spatial_indexes.creation_and_modification.balancing_algorithms_run_time_parameters">Balancing
222        algorithms run-time parameters</a>
223      </h5>
224<p>
225        Balancing algorithm parameters may be passed to the R-tree in run-time. To
226        use run-time versions of the R-tree one may pass parameters which names start
227        with <code class="computeroutput"><span class="identifier">dynamic_</span></code>.
228      </p>
229<pre class="programlisting"><span class="comment">// linear</span>
230<span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span>Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">dynamic_linear</span><span class="special">&gt;</span> <span class="identifier">rt</span><span class="special">(</span><span class="identifier">index</span><span class="special">::</span><span class="identifier">dynamic_linear</span><span class="special">(</span><span class="number">16</span><span class="special">));</span>
231
232<span class="comment">// quadratic</span>
233<span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span>Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">dynamic_quadratic</span><span class="special">&gt;</span> <span class="identifier">rt</span><span class="special">(</span><span class="identifier">index</span><span class="special">::</span><span class="identifier">dynamic_quadratic</span><span class="special">(</span><span class="number">16</span><span class="special">));</span>
234
235<span class="comment">// rstar</span>
236<span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span>Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">dynamic_rstar</span><span class="special">&gt;</span> <span class="identifier">rt</span><span class="special">(</span><span class="identifier">index</span><span class="special">::</span><span class="identifier">dynamic_rstar</span><span class="special">(</span><span class="number">16</span><span class="special">));</span>
237</pre>
238<p>
239        The obvious drawback is a slightly slower R-tree.
240      </p>
241<h5>
242<a name="geometry.spatial_indexes.creation_and_modification.h4"></a>
243        <span class="phrase"><a name="geometry.spatial_indexes.creation_and_modification.non_default_parameters"></a></span><a class="link" href="creation_and_modification.html#geometry.spatial_indexes.creation_and_modification.non_default_parameters">Non-default
244        parameters</a>
245      </h5>
246<p>
247        Non-default R-tree parameters are described in the reference.
248      </p>
249<h5>
250<a name="geometry.spatial_indexes.creation_and_modification.h5"></a>
251        <span class="phrase"><a name="geometry.spatial_indexes.creation_and_modification.copying__moving_and_swapping"></a></span><a class="link" href="creation_and_modification.html#geometry.spatial_indexes.creation_and_modification.copying__moving_and_swapping">Copying,
252        moving and swapping</a>
253      </h5>
254<p>
255        The R-tree is copyable and movable container. Move semantics is implemented
256        using Boost.Move library so it's possible to move the container on a compilers
257        without rvalue references support.
258      </p>
259<pre class="programlisting"><span class="comment">// default constructor</span>
260<span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span> Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">rstar</span><span class="special">&lt;</span><span class="number">8</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">rt1</span><span class="special">;</span>
261
262<span class="comment">// copy constructor</span>
263<span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span> Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">rstar</span><span class="special">&lt;</span><span class="number">8</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">rt2</span><span class="special">(</span><span class="identifier">r1</span><span class="special">);</span>
264
265<span class="comment">// copy assignment</span>
266<span class="identifier">rt2</span> <span class="special">=</span> <span class="identifier">r1</span><span class="special">;</span>
267
268<span class="comment">// move constructor</span>
269<span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span> Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">rstar</span><span class="special">&lt;</span><span class="number">8</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">rt3</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">rt1</span><span class="special">));</span>
270
271<span class="comment">// move assignment</span>
272<span class="identifier">rt3</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">rt2</span><span class="special">);</span>
273
274<span class="comment">// swap</span>
275<span class="identifier">rt3</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">rt2</span><span class="special">);</span>
276</pre>
277<h5>
278<a name="geometry.spatial_indexes.creation_and_modification.h6"></a>
279        <span class="phrase"><a name="geometry.spatial_indexes.creation_and_modification.inserting_and_removing_values"></a></span><a class="link" href="creation_and_modification.html#geometry.spatial_indexes.creation_and_modification.inserting_and_removing_values">Inserting
280        and removing Values</a>
281      </h5>
282<p>
283        The following code creates an R-tree using quadratic balancing algorithm.
284      </p>
285<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">geometry</span><span class="special">;</span>
286<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">Box</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> Value<span class="special">;</span>
287<span class="identifier">index</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span> Value<span class="special">,</span> <span class="identifier">index</span><span class="special">::</span><span class="identifier">quadratic</span><span class="special">&lt;</span><span class="number">16</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">rt</span><span class="special">;</span>
288</pre>
289<p>
290        To insert or remove a `Value' by method call one may use the following code.
291      </p>
292<pre class="programlisting">Value <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span>Box<span class="special">(...),</span> <span class="number">0</span><span class="special">);</span>
293
294<span class="identifier">rt</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
295
296<span class="identifier">rt</span><span class="special">.</span><span class="identifier">remove</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
297</pre>
298<p>
299        To insert or remove a `Value' by function call one may use the following
300        code.
301      </p>
302<pre class="programlisting">Value <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span>Box<span class="special">(...),</span> <span class="number">0</span><span class="special">);</span>
303
304<span class="identifier">index</span><span class="special">::</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">rt</span><span class="special">,</span> <span class="identifier">v</span><span class="special">);</span>
305
306<span class="identifier">index</span><span class="special">::</span><span class="identifier">remove</span><span class="special">(</span><span class="identifier">rt</span><span class="special">,</span> <span class="identifier">v</span><span class="special">);</span>
307</pre>
308<p>
309        Typically you will perform those operations in a loop in order to e.g. insert
310        some number of <code class="computeroutput">Value</code>s corresponding to geometrical objects (e.g.
311        <code class="computeroutput"><span class="identifier">Polygons</span></code>) stored in another
312        container.
313      </p>
314<h5>
315<a name="geometry.spatial_indexes.creation_and_modification.h7"></a>
316        <span class="phrase"><a name="geometry.spatial_indexes.creation_and_modification.additional_interface"></a></span><a class="link" href="creation_and_modification.html#geometry.spatial_indexes.creation_and_modification.additional_interface">Additional
317        interface</a>
318      </h5>
319<p>
320        The R-tree allows creation, inserting and removing of Values from a range.
321        The range may be passed as <code class="computeroutput"><span class="special">[</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span></code> Iterators
322        pair or as a Range adapted to one of the Boost.Range Concepts.
323      </p>
324<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">bgi</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">geometry</span><span class="special">::</span><span class="identifier">index</span><span class="special">;</span>
325<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">Box</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> Value<span class="special">;</span>
326<span class="keyword">typedef</span> <span class="identifier">bgi</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span> Value<span class="special">,</span> <span class="identifier">bgi</span><span class="special">::</span><span class="identifier">linear</span><span class="special">&lt;</span><span class="number">32</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">RTree</span><span class="special">;</span>
327
328<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>Value<span class="special">&gt;</span> <span class="identifier">values</span><span class="special">;</span>
329<span class="comment">/* vector filling code, here */</span>
330
331<span class="comment">// create R-tree with default constructor and insert values with insert(Value const&amp;)</span>
332<span class="identifier">RTree</span> <span class="identifier">rt1</span><span class="special">;</span>
333<span class="identifier">BOOST_FOREACH</span><span class="special">(</span>Value <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">,</span> <span class="identifier">values</span><span class="special">)</span>
334   <span class="identifier">rt1</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
335
336<span class="comment">// create R-tree with default constructor and insert values with insert(Iter, Iter)</span>
337<span class="identifier">RTree</span> <span class="identifier">rt2</span><span class="special">;</span>
338<span class="identifier">rt2</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">values</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">values</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
339
340<span class="comment">// create R-tree with default constructor and insert values with insert(Range)</span>
341<span class="identifier">RTree</span> <span class="identifier">rt3</span><span class="special">;</span>
342<span class="identifier">rt3</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">values_range</span><span class="special">);</span>
343
344<span class="comment">// create R-tree with constructor taking Iterators</span>
345<span class="identifier">RTree</span> <span class="identifier">rt4</span><span class="special">(</span><span class="identifier">values</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">values</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
346
347<span class="comment">// create R-tree with constructor taking Range</span>
348<span class="identifier">RTree</span> <span class="identifier">rt5</span><span class="special">(</span><span class="identifier">values_range</span><span class="special">);</span>
349
350<span class="comment">// remove values with remove(Value const&amp;)</span>
351<span class="identifier">BOOST_FOREACH</span><span class="special">(</span>Value <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">,</span> <span class="identifier">values</span><span class="special">)</span>
352   <span class="identifier">rt1</span><span class="special">.</span><span class="identifier">remove</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
353
354<span class="comment">// remove values with remove(Iter, Iter)</span>
355<span class="identifier">rt2</span><span class="special">.</span><span class="identifier">remove</span><span class="special">(</span><span class="identifier">values</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">values</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
356
357<span class="comment">// remove values with remove(Range)</span>
358<span class="identifier">rt3</span><span class="special">.</span><span class="identifier">remove</span><span class="special">(</span><span class="identifier">values_range</span><span class="special">);</span>
359</pre>
360<p>
361        Furthermore, it's possible to pass a Range adapted by one of the Boost.Range
362        adaptors into the rtree (more complete example can be found in the <span class="bold"><strong>Examples</strong></span> section).
363      </p>
364<pre class="programlisting"><span class="comment">// create Rtree containing `std::pair&lt;Box, int&gt;` from a container of Boxes on the fly.</span>
365<span class="identifier">RTree</span> <span class="identifier">rt6</span><span class="special">(</span><span class="identifier">boxes</span> <span class="special">|</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">adaptors</span><span class="special">::</span><span class="identifier">indexed</span><span class="special">()</span>
366                <span class="special">|</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">adaptors</span><span class="special">::</span><span class="identifier">transformed</span><span class="special">(</span><span class="identifier">pair_maker</span><span class="special">()));</span>
367</pre>
368<h5>
369<a name="geometry.spatial_indexes.creation_and_modification.h8"></a>
370        <span class="phrase"><a name="geometry.spatial_indexes.creation_and_modification.insert_iterator"></a></span><a class="link" href="creation_and_modification.html#geometry.spatial_indexes.creation_and_modification.insert_iterator">Insert
371        iterator</a>
372      </h5>
373<p>
374        There are functions like <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">()</span></code>, or R-tree's queries that copy values to
375        an output iterator. In order to insert values to a container in this kind
376        of function insert iterators may be used. Geometry.Index provide its own
377        <code class="computeroutput"><span class="identifier">bgi</span><span class="special">::</span><span class="identifier">insert_iterator</span><span class="special">&lt;</span><span class="identifier">Container</span><span class="special">&gt;</span></code>
378        which is generated by <code class="computeroutput"><span class="identifier">bgi</span><span class="special">::</span><span class="identifier">inserter</span><span class="special">()</span></code> function.
379      </p>
380<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">bgi</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">geometry</span><span class="special">::</span><span class="identifier">index</span><span class="special">;</span>
381<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">Box</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> Value<span class="special">;</span>
382<span class="keyword">typedef</span> <span class="identifier">bgi</span><span class="special">::</span><span class="identifier">rtree</span><span class="special">&lt;</span> Value<span class="special">,</span> <span class="identifier">bgi</span><span class="special">::</span><span class="identifier">linear</span><span class="special">&lt;</span><span class="number">32</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">RTree</span><span class="special">;</span>
383
384<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>Value<span class="special">&gt;</span> <span class="identifier">values</span><span class="special">;</span>
385<span class="comment">/* vector filling code, here */</span>
386
387<span class="comment">// create R-tree and insert values from the vector</span>
388<span class="identifier">RTree</span> <span class="identifier">rt1</span><span class="special">;</span>
389<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">values</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">values</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">bgi</span><span class="special">::</span><span class="identifier">inserter</span><span class="special">(</span><span class="identifier">rt1</span><span class="special">));</span>
390
391<span class="comment">// create R-tree and insert values returned by a query</span>
392<span class="identifier">RTree</span> <span class="identifier">rt2</span><span class="special">;</span>
393<span class="identifier">rt1</span><span class="special">.</span><span class="identifier">spatial_query</span><span class="special">(</span><span class="identifier">Box</span><span class="special">(/*...*/),</span> <span class="identifier">bgi</span><span class="special">::</span><span class="identifier">inserter</span><span class="special">(</span><span class="identifier">rt2</span><span class="special">));</span>
394</pre>
395</div>
396<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
397<td align="left"></td>
398<td align="right"><div class="copyright-footer">Copyright © 2009-2019 Barend Gehrels, Bruno Lalande, Mateusz Loskot, Adam
399      Wulkiewicz, Oracle and/or its affiliates<p>
400        Distributed under the Boost Software License, Version 1.0. (See accompanying
401        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>)
402      </p>
403</div></td>
404</tr></table>
405<hr>
406<div class="spirit-nav">
407<a accesskey="p" href="rtree_quickstart.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../spatial_indexes.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="queries.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
408</div>
409</body>
410</html>
411