For a given interface type <code class="computeroutput"><span class="identifier">I</span></code>,
an operation <span class="bold"><strong>subobject</strong></span>(<code class="computeroutput"><span class="identifier">x</span></code>) that maps each value of an implementation
type to its internally used value <code class="computeroutput"><span class="identifier">y</span></code>
- of a possibly different implementation type <a href="#ftn.poly_collection.reference.polymorphism_models.f0" class="footnote" name="poly_collection.reference.polymorphism_models.f0"><sup class="footnote">[20]</sup></a>.
+ of a possibly different implementation type <a href="#ftn.poly_collection.reference.polymorphism_models.f0" class="footnote" name="poly_collection.reference.polymorphism_models.f0"><sup class="footnote">[22]</sup></a>.
</li>
</ul></div>
<p>
Insertion and erasure do not invalidate iterators (global or local) except
those from the insertion/erasure point to the end of the affected segment,
if its capacity is not exceeded, or all iterators/references to the segment
- otherwise <a href="#ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.f0" class="footnote" name="poly_collection.reference.polymorphic_containers.polymorphic_collections.f0"><sup class="footnote">[21]</sup></a>.
+ otherwise <a href="#ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.f0" class="footnote" name="poly_collection.reference.polymorphic_containers.polymorphic_collections.f0"><sup class="footnote">[23]</sup></a>.
</p>
<p>
For the description of the remaining requirements of polymorphic collections,
<p>
<span class="bold"><strong>Effects:</strong></span> For each of the elements of
the range in succession, registers the type of its subobject if needed
- and inserts it into the collection <a href="#ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f0" class="footnote" name="poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f0"><sup class="footnote">[22]</sup></a>.
+ and inserts it into the collection <a href="#ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f0" class="footnote" name="poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f0"><sup class="footnote">[24]</sup></a>.
</p>
<p>
<a name="poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.insert_hint_range"></a><code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">it</span><span class="special">,</span><span class="identifier">i1</span><span class="special">,</span><span class="identifier">i2</span><span class="special">)</span></code>
<span class="bold"><strong>Effects:</strong></span> If <code class="computeroutput"><span class="identifier">it</span><span class="special">==</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></code>, equivalent to <code class="computeroutput"><span class="keyword">while</span><span class="special">(</span><span class="identifier">i1</span><span class="special">!=</span><span class="identifier">i2</span><span class="special">)</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">it</span><span class="special">,*</span><span class="identifier">i1</span><span class="special">++)</span></code>, otherwise inserts each of the elements
in [<code class="computeroutput"><span class="identifier">i1</span></code>, <code class="computeroutput"><span class="identifier">i2</span></code>) in succession with a hint pointing
to <code class="computeroutput"><span class="special">*</span><span class="identifier">it</span></code>
- <a href="#ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f1" class="footnote" name="poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f1"><sup class="footnote">[23]</sup></a>.
+ <a href="#ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f1" class="footnote" name="poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f1"><sup class="footnote">[25]</sup></a>.
</p>
<p>
<code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">it</span><span class="special">,</span><span class="identifier">it1</span><span class="special">,</span><span class="identifier">it2</span><span class="special">)</span></code><br>
version, otherwise for each of the elements in [<code class="computeroutput"><span class="identifier">i1</span></code>,
<code class="computeroutput"><span class="identifier">i2</span></code>) in succession registers
the type of its subobject if needed and inserts it into the collection
- with a hint pointing to <code class="computeroutput"><span class="special">*</span><span class="identifier">it</span></code> <a href="#ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f2" class="footnote" name="poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f2"><sup class="footnote">[24]</sup></a>.
+ with a hint pointing to <code class="computeroutput"><span class="special">*</span><span class="identifier">it</span></code> <a href="#ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f2" class="footnote" name="poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f2"><sup class="footnote">[26]</sup></a>.
</p>
<p>
<code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">lbit</span><span class="special">,</span><span class="identifier">i1</span><span class="special">,</span><span class="identifier">i2</span><span class="special">)</span></code>
<code class="computeroutput"><span class="identifier">T</span><span class="special">&</span></code>
if pointing to a segment for <code class="computeroutput"><span class="identifier">T</span></code>
and <code class="computeroutput"><span class="identifier">T</span></code> is in <code class="computeroutput"><span class="identifier">Ts</span><span class="special">...</span></code>
- <a href="#ftn.poly_collection.reference.header_boost_poly_collection_alg.f0" class="footnote" name="poly_collection.reference.header_boost_poly_collection_alg.f0"><sup class="footnote">[25]</sup></a>.<br> <span class="bold"><strong>Effects:</strong></span> Equivalent to
+ <a href="#ftn.poly_collection.reference.header_boost_poly_collection_alg.f0" class="footnote" name="poly_collection.reference.header_boost_poly_collection_alg.f0"><sup class="footnote">[27]</sup></a>.<br> <span class="bold"><strong>Effects:</strong></span> Equivalent to
<code class="computeroutput"><span class="identifier">expr</span></code>.<br> <span class="bold"><strong>Returns:</strong></span>
<code class="computeroutput"><span class="identifier">expr</span></code>.<br> <span class="bold"><strong>Complexity:</strong></span>
That of <code class="computeroutput"><span class="identifier">expr</span></code>.
</div>
<div class="footnotes">
<br><hr style="width:100; text-align:left;margin-left: 0">
-<div id="ftn.poly_collection.reference.polymorphism_models.f0" class="footnote"><p><a href="#poly_collection.reference.polymorphism_models.f0" class="para"><sup class="para">[20] </sup></a>
+<div id="ftn.poly_collection.reference.polymorphism_models.f0" class="footnote"><p><a href="#poly_collection.reference.polymorphism_models.f0" class="para"><sup class="para">[22] </sup></a>
This is a metalinguistic definition not directly expressible in C++.
There are equivalent formulations that can indeed be realized in C++,
but they add little to the comprehension of the concepts.
</p></div>
-<div id="ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.f0" class="footnote"><p><a href="#poly_collection.reference.polymorphic_containers.polymorphic_collections.f0" class="para"><sup class="para">[21] </sup></a>
+<div id="ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.f0" class="footnote"><p><a href="#poly_collection.reference.polymorphic_containers.polymorphic_collections.f0" class="para"><sup class="para">[23] </sup></a>
The global <code class="computeroutput"><span class="identifier">end</span><span class="special">()</span></code>
iterator lies outside any segment, hence it always remain valid.
</p></div>
-<div id="ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f0" class="footnote"><p><a href="#poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f0" class="para"><sup class="para">[22] </sup></a>
+<div id="ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f0" class="footnote"><p><a href="#poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f0" class="para"><sup class="para">[24] </sup></a>
Note that, unlike <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">i1</span><span class="special">,</span><span class="identifier">i2</span><span class="special">)</span></code>, these versions do not throw due to
type registration problems.
</p></div>
-<div id="ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f1" class="footnote"><p><a href="#poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f1" class="para"><sup class="para">[23] </sup></a>
+<div id="ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f1" class="footnote"><p><a href="#poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f1" class="para"><sup class="para">[25] </sup></a>
That is, the hint remains stable even if <code class="computeroutput"><span class="identifier">it</span></code>
may become invalid due to reallocations.
</p></div>
-<div id="ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f2" class="footnote"><p><a href="#poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f2" class="para"><sup class="para">[24] </sup></a>
+<div id="ftn.poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f2" class="footnote"><p><a href="#poly_collection.reference.polymorphic_containers.polymorphic_collections.modifiers.f2" class="para"><sup class="para">[26] </sup></a>
The two previous notes apply here.
</p></div>
-<div id="ftn.poly_collection.reference.header_boost_poly_collection_alg.f0" class="footnote"><p><a href="#poly_collection.reference.header_boost_poly_collection_alg.f0" class="para"><sup class="para">[25] </sup></a>
+<div id="ftn.poly_collection.reference.header_boost_poly_collection_alg.f0" class="footnote"><p><a href="#poly_collection.reference.header_boost_poly_collection_alg.f0" class="para"><sup class="para">[27] </sup></a>
Strictly speaking a proper <a href="http://en.cppreference.com/w/cpp/named_req/ForwardIterator" target="_top"><span class="bold"><strong><code class="computeroutput"><span class="identifier">ForwardIterator</span></code></strong></span></a>
cannot behave like this as dereferencing must yield <span class="emphasis"><em>exactly</em></span>
a (<code class="computeroutput"><span class="keyword">const</span></code>) <code class="computeroutput"><span class="identifier">value_type</span><span class="special">&</span></code> value, which disallows this type of