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>Tutorial: sequence_container_interface</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="../stl_interfaces.html" title="Chapter 38. Boost.STLInterfaces"> 10<link rel="prev" href="tutorial___view_interface_.html" title="Tutorial: view_interface"> 11<link rel="next" href="tutorial___reverse_iterator_.html" title="Tutorial: reverse_iterator"> 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="tutorial___view_interface_.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stl_interfaces.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="tutorial___reverse_iterator_.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="boost_stlinterfaces.tutorial___sequence_container_interface_"></a><a class="link" href="tutorial___sequence_container_interface_.html" title="Tutorial: sequence_container_interface">Tutorial: 29 <code class="computeroutput"><span class="identifier">sequence_container_interface</span></code></a> 30</h2></div></div></div> 31<div class="note"><table border="0" summary="Note"> 32<tr> 33<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 34<th align="left">Note</th> 35</tr> 36<tr><td align="left" valign="top"><p> 37 All the member functions provided by <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 38 are in your container's base class — <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 39 — and can therefore be hidden if you define a member function with 40 the same name in your derived container. If you don't like the semantics 41 of any <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>-provided 42 member function, feel free to replace it. 43 </p></td></tr> 44</table></div> 45<h4> 46<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h0"></a> 47 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.the__code__phrase_role__identifier__sequence_container_interface__phrase___code__template"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.the__code__phrase_role__identifier__sequence_container_interface__phrase___code__template">The 48 <code class="computeroutput"><span class="identifier">sequence_container_interface</span></code> 49 Template</a> 50 </h4> 51<p> 52 As mentioned earlier, writing containers is very tedious. The container requirements 53 tables in the C++ standard are long and complicated, and there are a lot of 54 them. The requirements often call for multiple overloads of a function, all 55 of which could be implemented in terms of just one overload. 56 </p> 57<p> 58 There is a large development cost associated with implementing a standard-compliant 59 container. As a result very few people do so. <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 60 exists to make bring that large development time way, way down. 61 </p> 62<p> 63 Here is its declaration: 64 </p> 65<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Derived</span><span class="special">,</span> <span class="identifier">element_layout</span> <span class="identifier">Contiguity</span> <span class="special">=</span> <span class="identifier">element_layout</span><span class="special">::</span><span class="identifier">discontiguous</span><span class="special">></span> 66<span class="keyword">struct</span> <span class="identifier">sequence_container_interface</span><span class="special">;</span> 67</pre> 68<p> 69 Just as with <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/view_interface.html" title="Struct template view_interface">view_interface</a></code>, <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 70 takes the derived type and an optional non-type template parameter that indicates 71 whether <code class="computeroutput"><span class="identifier">Derived</span></code>'s iterators 72 are contiguous. The non-type parameter is necessary to support pre-C++20 code. 73 </p> 74<h4> 75<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h1"></a> 76 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.how__code__phrase_role__identifier__sequence_container_interface__phrase___code__is_organized"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.how__code__phrase_role__identifier__sequence_container_interface__phrase___code__is_organized">How 77 <code class="computeroutput"><span class="identifier">sequence_container_interface</span></code> 78 is Organized</a> 79 </h4> 80<p> 81 The tables below represent a subset of the operations needed for each of the 82 container requirements tables in the standard. Here are the tables that apply 83 to sequence containers (from <code class="computeroutput"><span class="special">[</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">requirements</span><span class="special">]</span></code> 84 in the standard): 85 </p> 86<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 87<li class="listitem"> 88 Container requirements <code class="computeroutput"><span class="special">[</span><span class="identifier">tab</span><span class="special">:</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">req</span><span class="special">]</span></code> 89 </li> 90<li class="listitem"> 91 Reversible container requirements <code class="computeroutput"><span class="special">[</span><span class="identifier">tab</span><span class="special">:</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">rev</span><span class="special">.</span><span class="identifier">req</span><span class="special">]</span></code> 92 </li> 93<li class="listitem"> 94 Optional container operations <code class="computeroutput"><span class="special">[</span><span class="identifier">tab</span><span class="special">:</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">opt</span><span class="special">]</span></code> 95 </li> 96<li class="listitem"> 97 Allocator-aware container requirements <code class="computeroutput"><span class="special">[</span><span class="identifier">tab</span><span class="special">:</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">alloc</span><span class="special">.</span><span class="identifier">req</span><span class="special">]</span></code> 98 </li> 99<li class="listitem"> 100 Sequence container requirements <code class="computeroutput"><span class="special">[</span><span class="identifier">tab</span><span class="special">:</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">seq</span><span class="special">.</span><span class="identifier">req</span><span class="special">]</span></code> 101 </li> 102<li class="listitem"> 103 Optional sequence container operations <code class="computeroutput"><span class="special">[</span><span class="identifier">tab</span><span class="special">:</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">seq</span><span class="special">.</span><span class="identifier">opt</span><span class="special">]</span></code> 104 </li> 105</ul></div> 106<p> 107 Each requirements table lists all the types and operations required by a standard-conforming 108 container. All of these sets of requirements are supported by <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>, 109 except the allocator-aware container requirements. The container and sequence 110 container requirements are required for any sequence container. <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 111 provides each member in any table above (again, except the allocator-aware 112 ones). Each member is individually constrained, so if a given member (say, 113 a particular <code class="computeroutput"><span class="identifier">insert</span><span class="special">()</span></code> 114 overload) is ill-formed, it will not be usable in the resulting container. 115 </p> 116<div class="note"><table border="0" summary="Note"> 117<tr> 118<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 119<th align="left">Note</th> 120</tr> 121<tr><td align="left" valign="top"><p> 122 All table requirements satisfied by Boost.STLInterfaces use the 2017 version 123 of the C++ Standard. See your favorite online resource for the contents of 124 these tables. Many people like <a href="http://eel.is/c++draft" target="_top">eel.is</a>, 125 which is really easy to navigate. 126 </p></td></tr> 127</table></div> 128<p> 129 Note that <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 130 does not interact at all with the allocator-aware container requirements, the 131 associative container requirements, or the unordered associative container 132 requirements. Specifically, nothing precludes you from satisfying any of those 133 sets or requirements — it's just that <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 134 does not. 135 </p> 136<h4> 137<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h2"></a> 138 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.how__code__phrase_role__identifier__sequence_container_interface__phrase___code__works"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.how__code__phrase_role__identifier__sequence_container_interface__phrase___code__works">How 139 <code class="computeroutput"><span class="identifier">sequence_container_interface</span></code> 140 Works</a> 141 </h4> 142<p> 143 To use <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>, 144 you provide certain operations yourself, and <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 145 fills in the rest. If any provided operation <code class="computeroutput"><span class="identifier">O</span></code> 146 is not to your liking — say, because you know of a way to do <code class="computeroutput"><span class="identifier">O</span></code> directly in a way that is more efficient 147 than the way that <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 148 does it — you can implement <code class="computeroutput"><span class="identifier">O</span></code> 149 yourself. Since your implementation is in a class <code class="computeroutput"><span class="identifier">D</span></code> 150 derived from <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>, 151 it will hide the <code class="computeroutput"><span class="identifier">O</span></code> from <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>. 152 </p> 153<p> 154 Below, there are tables that show what user-defined types and operations are 155 required for <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 156 to fulfill all the requirements from one of the C++ Standard's requirements 157 tables. For instance, the table "Optional User-Defined Types and Operations 158 for Containers" below shows what you need to provide to fulfill all the 159 requirements in the standard's "Container requirements <code class="computeroutput"><span class="special">[</span><span class="identifier">tab</span><span class="special">:</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">req</span><span class="special">]</span></code>" 160 table. 161 </p> 162<p> 163 So, to use <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 164 to make a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span></code>-like container (which is not a sequence 165 container, because it has no <code class="computeroutput"><span class="identifier">insert</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">erase</span><span class="special">()</span></code>, etc.), you need to define the types and 166 operations in the "User-Defined Types and Operations for Containers" 167 table, and optionally the ones in the "Optional User-Defined Types and 168 Operations for Containers". 169 </p> 170<p> 171 To make a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward_list</span></code>-like type, you need to define 172 the types and operations in the "User-Defined Types and Operations for 173 Containers" table, and optionally the ones in the "Optional User-Defined 174 Types and Operations for Containers". You would also define the types 175 and operations in the "User-Defined Types and Operations for Sequence 176 Containers" table. You cannot define the types and operations in the "User-Defined 177 Types and Operations for Reversible Containers" table, because your container 178 is forward-only. 179 </p> 180<p> 181 To make a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>-like type, you would provide the types 182 and operations in all the tables below. 183 </p> 184<p> 185 If you have a type that does not have all the operations in one of the tables, 186 that's fine -- you can just implement the operations that your type can do, 187 and whatever operations can be provided by <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 188 in terms of the user-defined operations, will be provided. For example, the 189 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span></code>-like container described above would 190 have <code class="computeroutput"><span class="identifier">front</span><span class="special">()</span></code> 191 — which comes from the optional sequence container requirements — 192 even if you did not write any user-defined insertion or erasure member functions 193 into your container. If it has bidirectional iterators, the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span></code>-like 194 container will have <code class="computeroutput"><span class="identifier">back</span><span class="special">()</span></code> 195 too. 196 </p> 197<h4> 198<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h3"></a> 199 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.the__code__phrase_role__identifier__sequence_container_interface__phrase___code__tables"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.the__code__phrase_role__identifier__sequence_container_interface__phrase___code__tables">The 200 <code class="computeroutput"><span class="identifier">sequence_container_interface</span></code> 201 Tables</a> 202 </h4> 203<p> 204 After each requirements table, there's a table indicating how <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 205 maps the user-defined operations to the operations it provides. These mapping 206 tables can be handy if you have a container that meets only some of the requirements 207 of one of the requirements tables. 208 </p> 209<p> 210 In the tables, <code class="computeroutput"><span class="identifier">X</span></code> is a user-defined 211 type derived from <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 212 containing objects of type <code class="computeroutput"><span class="identifier">T</span></code>; 213 <code class="computeroutput"><span class="identifier">a</span></code> and <code class="computeroutput"><span class="identifier">b</span></code> 214 are objects of type <code class="computeroutput"><span class="identifier">X</span></code>; <code class="computeroutput"><span class="identifier">i</span></code> and <code class="computeroutput"><span class="identifier">j</span></code> 215 are objects of type (possibly const) <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code>; 216 <code class="computeroutput"><span class="identifier">u</span></code> is an identifier; <code class="computeroutput"><span class="identifier">r</span></code> is a non-const value of type <code class="computeroutput"><span class="identifier">X</span></code>; <code class="computeroutput"><span class="identifier">rv_c</span></code> 217 is a non-const rvalue of type <code class="computeroutput"><span class="identifier">X</span></code>; 218 <code class="computeroutput"><span class="identifier">i</span></code> and <code class="computeroutput"><span class="identifier">j</span></code> 219 are forward iterators that refer to elements implicitly convertible to <code class="computeroutput"><span class="identifier">T</span></code>; <code class="computeroutput"><span class="special">[</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span></code> is a range; <code class="computeroutput"><span class="identifier">il</span></code> 220 is an object of type <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">initializer_list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>; <code class="computeroutput"><span class="identifier">n</span></code> is a value of type <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">size_type</span></code>, 221 <code class="computeroutput"><span class="identifier">p</span></code> is a valid constant iterator 222 to <code class="computeroutput"><span class="identifier">a</span></code>; <code class="computeroutput"><span class="identifier">q</span></code> 223 is a valid dereferenceable constant iterator to <code class="computeroutput"><span class="identifier">a</span></code>; 224 <code class="computeroutput"><span class="special">[</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span></code> 225 is a valid range of constant iterators to <code class="computeroutput"><span class="identifier">a</span></code>; 226 <code class="computeroutput"><span class="identifier">t</span></code> is an lvalue or a const rvalue 227 of T; and <code class="computeroutput"><span class="identifier">rv</span></code> denotes a non-const 228 rvalue of <code class="computeroutput"><span class="identifier">T</span></code>. <code class="computeroutput"><span class="identifier">Args</span></code> is a template parameter pack; <code class="computeroutput"><span class="identifier">args</span></code> denotes a function parameter pack with 229 the pattern <code class="computeroutput"><span class="identifier">Args</span> <span class="special">&&</span></code>. 230 </p> 231<h4> 232<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h4"></a> 233 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.container"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.container">Container</a> 234 </h4> 235<p> 236 All containers must meet the requirements of this table: 237 </p> 238<div class="table"> 239<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.t0"></a><p class="title"><b>Table 38.3. User-Defined Types and Operations for Containers</b></p> 240<div class="table-contents"><table class="table" summary="User-Defined Types and Operations for Containers"> 241<colgroup> 242<col> 243<col> 244<col> 245<col> 246</colgroup> 247<thead><tr> 248<th> 249 <p> 250 Expression 251 </p> 252 </th> 253<th> 254 <p> 255 Return Type 256 </p> 257 </th> 258<th> 259 <p> 260 Semantics 261 </p> 262 </th> 263<th> 264 <p> 265 Assertion/note/pre-/post-condition 266 </p> 267 </th> 268</tr></thead> 269<tbody> 270<tr> 271<td> 272 <p> 273 <code class="computeroutput"><span class="identifier">X</span><span class="error"></span><span class="special">::</span><span class="error"></span><span class="identifier">value_type</span></code> 274 </p> 275 </td> 276<td> 277 <p> 278 <code class="computeroutput"><span class="identifier">T</span></code> 279 </p> 280 </td> 281<td> 282 </td> 283<td> 284 <p> 285 Compile time only. 286 </p> 287 </td> 288</tr> 289<tr> 290<td> 291 <p> 292 <code class="computeroutput"><span class="identifier">X</span><span class="error"></span><span class="special">::</span><span class="error"></span><span class="identifier">reference</span></code> 293 </p> 294 </td> 295<td> 296 <p> 297 <code class="computeroutput"><span class="identifier">T</span> <span class="special">&</span></code> 298 </p> 299 </td> 300<td> 301 </td> 302<td> 303 <p> 304 Compile time only. 305 </p> 306 </td> 307</tr> 308<tr> 309<td> 310 <p> 311 <code class="computeroutput"><span class="identifier">X</span><span class="error"></span><span class="special">::</span><span class="error"></span><span class="identifier">const_reference</span></code> 312 </p> 313 </td> 314<td> 315 <p> 316 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span> 317 <span class="special">&</span></code> 318 </p> 319 </td> 320<td> 321 </td> 322<td> 323 <p> 324 Compile time only. 325 </p> 326 </td> 327</tr> 328<tr> 329<td> 330 <p> 331 <code class="computeroutput"><span class="identifier">X</span><span class="error"></span><span class="special">::</span><span class="error"></span><span class="identifier">iterator</span></code> 332 </p> 333 </td> 334<td> 335 <p> 336 An iterator whose <code class="computeroutput"><span class="identifier">value_type</span></code> 337 is <code class="computeroutput"><span class="identifier">T</span></code>. 338 </p> 339 </td> 340<td> 341 </td> 342<td> 343 <p> 344 Must meet the forward iterator requirements, and must be convertible 345 to <code class="computeroutput"><span class="identifier">X</span><span class="error"></span><span class="special">::</span><span class="error"></span><span class="identifier">const_iterator</span></code>. Compile time only. 346 </p> 347 </td> 348</tr> 349<tr> 350<td> 351 <p> 352 <code class="computeroutput"><span class="identifier">X</span><span class="error"></span><span class="special">::</span><span class="error"></span><span class="identifier">const_iterator</span></code> 353 </p> 354 </td> 355<td> 356 <p> 357 A constant iterator whose <code class="computeroutput"><span class="identifier">value_type</span></code> 358 is <code class="computeroutput"><span class="identifier">T</span></code>. 359 </p> 360 </td> 361<td> 362 </td> 363<td> 364 <p> 365 Must meet the forward iterator requirements. Compile time only. 366 </p> 367 </td> 368</tr> 369<tr> 370<td> 371 <p> 372 <code class="computeroutput"><span class="identifier">X</span><span class="error"></span><span class="special">::</span><span class="error"></span><span class="identifier">difference_type</span></code> 373 </p> 374 </td> 375<td> 376 <p> 377 A signed integer type. 378 </p> 379 </td> 380<td> 381 </td> 382<td> 383 <p> 384 Identical to the diference type of <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code> 385 and <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_iterator</span></code>. Compile time only. 386 </p> 387 </td> 388</tr> 389<tr> 390<td> 391 <p> 392 <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">size_type</span></code> 393 </p> 394 </td> 395<td> 396 <p> 397 An unsigned integer type. 398 </p> 399 </td> 400<td> 401 </td> 402<td> 403 <p> 404 Compile time only. 405 </p> 406 </td> 407</tr> 408<tr> 409<td> 410 <p> 411 <code class="computeroutput"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">;</span></code> 412 </p> 413 </td> 414<td> 415 </td> 416<td> 417 </td> 418<td> 419 <p> 420 <span class="emphasis"><em>Ensures:</em></span> <code class="computeroutput"><span class="identifier">u</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code> 421 </p> 422 </td> 423</tr> 424<tr> 425<td> 426 <p> 427</p> 428<pre class="programlisting"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span> 429<span class="identifier">X</span> <span class="identifier">u</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span> 430</pre> 431<p> 432 </p> 433 </td> 434<td> 435 </td> 436<td> 437 </td> 438<td> 439 <p> 440 <span class="emphasis"><em>Ensures:</em></span> <code class="computeroutput"><span class="identifier">u</span> 441 <span class="special">==</span> <span class="identifier">a</span></code> 442 </p> 443 </td> 444</tr> 445<tr> 446<td> 447 <p> 448</p> 449<pre class="programlisting"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">rv</span><span class="special">);</span> 450<span class="identifier">X</span> <span class="identifier">u</span> <span class="special">=</span> <span class="identifier">rv</span><span class="special">;</span> 451</pre> 452<p> 453 </p> 454 </td> 455<td> 456 </td> 457<td> 458 </td> 459<td> 460 <p> 461 <span class="emphasis"><em>Ensures:</em></span> <code class="computeroutput"><span class="identifier">u</span></code> 462 is equal to the value <code class="computeroutput"><span class="identifier">rv_c</span></code> 463 had before this operation. 464 </p> 465 </td> 466</tr> 467<tr> 468<td> 469 <p> 470 <code class="computeroutput"><span class="identifier">a</span> <span class="special">=</span> 471 <span class="identifier">rv</span></code> 472 </p> 473 </td> 474<td> 475 <p> 476 <code class="computeroutput"><span class="identifier">X</span> <span class="special">&</span></code> 477 </p> 478 </td> 479<td> 480 <p> 481 All existing elements of <code class="computeroutput"><span class="identifier">a</span></code> 482 are either move assigned to or destroyed. 483 </p> 484 </td> 485<td> 486 <p> 487 <span class="emphasis"><em>Ensures:</em></span> <code class="computeroutput"><span class="identifier">u</span></code> 488 is equal to the value <code class="computeroutput"><span class="identifier">rv_c</span></code> 489 had before this operation. 490 </p> 491 </td> 492</tr> 493<tr> 494<td> 495 <p> 496 <code class="computeroutput"><span class="identifier">a</span><span class="special">.~</span><span class="identifier">X</span><span class="special">()</span></code> 497 </p> 498 </td> 499<td> 500 </td> 501<td> 502 <p> 503 Destroys every element of <code class="computeroutput"><span class="identifier">a</span></code>; 504 any memory obtained is deallocated. 505 </p> 506 </td> 507<td> 508 </td> 509</tr> 510<tr> 511<td> 512 <p> 513 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span></code> 514 </p> 515 </td> 516<td> 517 <p> 518 <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code> 519 </p> 520 </td> 521<td> 522 </td> 523<td> 524 <p> 525 This is the non-<code class="computeroutput"><span class="keyword">const</span></code> 526 overload; the <code class="computeroutput"><span class="keyword">const</span></code> 527 overload is not needed. 528 </p> 529 </td> 530</tr> 531<tr> 532<td> 533 <p> 534 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></code> 535 </p> 536 </td> 537<td> 538 <p> 539 <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code> 540 </p> 541 </td> 542<td> 543 </td> 544<td> 545 <p> 546 This is the non-<code class="computeroutput"><span class="keyword">const</span></code> 547 overload; the <code class="computeroutput"><span class="keyword">const</span></code> 548 overload is not needed. 549 </p> 550 </td> 551</tr> 552<tr> 553<td> 554 <p> 555 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span></code> 556 </p> 557 </td> 558<td> 559 <p> 560 Convertible to <code class="computeroutput"><span class="keyword">bool</span></code>. 561 </p> 562 </td> 563<td> 564 <p> 565 Exchanges the contents of <code class="computeroutput"><span class="identifier">a</span></code> 566 and <code class="computeroutput"><span class="identifier">b</span></code>. 567 </p> 568 </td> 569<td> 570 </td> 571</tr> 572<tr> 573<td> 574 <p> 575 <code class="computeroutput"><span class="identifier">r</span> <span class="special">=</span> 576 <span class="identifier">a</span></code> 577 </p> 578 </td> 579<td> 580 <p> 581 <code class="computeroutput"><span class="identifier">X</span> <span class="special">&</span></code> 582 </p> 583 </td> 584<td> 585 </td> 586<td> 587 <p> 588 <span class="emphasis"><em>Ensures:</em></span> <code class="computeroutput"><span class="identifier">r</span></code> 589 == <code class="computeroutput"><span class="identifier">a</span></code>. 590 </p> 591 </td> 592</tr> 593<tr> 594<td> 595 <p> 596 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code> 597 </p> 598 </td> 599<td> 600 <p> 601 <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">size_type</span></code> 602 </p> 603 </td> 604<td> 605 <p> 606 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">l</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> 607 <span class="identifier">l</span><span class="special">.</span><span class="identifier">end</span><span class="special">())</span></code> 608 for the largest possible container <code class="computeroutput"><span class="identifier">l</span></code>. 609 </p> 610 </td> 611<td> 612 </td> 613</tr> 614</tbody> 615</table></div> 616</div> 617<br class="table-break"><div class="note"><table border="0" summary="Note"> 618<tr> 619<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 620<th align="left">Note</th> 621</tr> 622<tr><td align="left" valign="top"><p> 623 The requirements above are taken from the standard. Even though the standard 624 requires things to be a certain way, you can often define types that work 625 in any context in which a container is supposed to work, even though it varies 626 from the requirements above. In particular, you may want to have non-reference 627 and non-pointer types for <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">reference</span></code> 628 and <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">pointer</span></code>, respectively — and that 629 certainly will not break <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>. 630 </p></td></tr> 631</table></div> 632<p> 633 If you provide the types and operations above, <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 634 will provide the rest of the container requirements, using this mapping: 635 </p> 636<div class="table"> 637<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.t1"></a><p class="title"><b>Table 38.4. User-Defined Operations to sequence_container_interface Operations</b></p> 638<div class="table-contents"><table class="table" summary="User-Defined Operations to sequence_container_interface Operations"> 639<colgroup> 640<col> 641<col> 642<col> 643</colgroup> 644<thead><tr> 645<th> 646 <p> 647 User-Defined 648 </p> 649 </th> 650<th> 651 <p> 652 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>-Provided 653 </p> 654 </th> 655<th> 656 <p> 657 Note 658 </p> 659 </th> 660</tr></thead> 661<tbody> 662<tr> 663<td> 664 <p> 665</p> 666<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span> 667<span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></pre> 668<p> 669 </p> 670 </td> 671<td> 672 <p> 673</p> 674<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span> 675<span class="identifier">a</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> 676<span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span> 677<span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span> 678<span class="identifier">a</span><span class="special">.</span><span class="identifier">cbegin</span><span class="special">()</span> 679<span class="identifier">a</span><span class="special">.</span><span class="identifier">cend</span><span class="special">()</span></pre> 680<p> 681 </p> 682 </td> 683<td> 684 <p> 685 The user-defined <code class="computeroutput"><span class="identifier">begin</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">end</span><span class="special">()</span></code> are non-<code class="computeroutput"><span class="keyword">const</span></code>, 686 and the <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>-provided 687 ones are <code class="computeroutput"><span class="keyword">const</span></code>. <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 688 can only provide <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code> if <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_iterator</span></code> 689 is a random access iterator; otherwise, it must be user-defined. 690 </p> 691 </td> 692</tr> 693<tr> 694<td> 695 <p> 696 <code class="computeroutput"><span class="identifier">a</span> <span class="special">==</span> 697 <span class="identifier">b</span></code> 698 </p> 699 </td> 700<td> 701 <p> 702 <code class="computeroutput"><span class="identifier">a</span> <span class="special">!=</span> 703 <span class="identifier">b</span></code> 704 </p> 705 </td> 706<td> 707 <p> 708 Though <code class="computeroutput"><span class="identifier">a</span> <span class="special">==</span> 709 <span class="identifier">b</span></code> is provided by <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>, 710 any user-defined replacement will be used to provide <code class="computeroutput"><span class="identifier">a</span> <span class="special">!=</span> 711 <span class="identifier">b</span></code>. 712 </p> 713 </td> 714</tr> 715<tr> 716<td> 717 <p> 718 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span></code> 719 </p> 720 </td> 721<td> 722 <p> 723 <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span></code> 724 </p> 725 </td> 726<td> 727 </td> 728</tr> 729</tbody> 730</table></div> 731</div> 732<br class="table-break"><h4> 733<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h5"></a> 734 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.reversible_container"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.reversible_container">Reversible 735 Container</a> 736 </h4> 737<p> 738 Containers that are reverse-iterable must meet the requirements of this table 739 (in addition to the container requirements): 740 </p> 741<div class="table"> 742<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.t2"></a><p class="title"><b>Table 38.5. User-Defined Types and Operations for Reversible Containers</b></p> 743<div class="table-contents"><table class="table" summary="User-Defined Types and Operations for Reversible Containers"> 744<colgroup> 745<col> 746<col> 747<col> 748<col> 749</colgroup> 750<thead><tr> 751<th> 752 <p> 753 Expression 754 </p> 755 </th> 756<th> 757 <p> 758 Return Type 759 </p> 760 </th> 761<th> 762 <p> 763 Semantics 764 </p> 765 </th> 766<th> 767 <p> 768 Assertion/note/pre-/post-condition 769 </p> 770 </th> 771</tr></thead> 772<tbody> 773<tr> 774<td> 775 <p> 776 <code class="computeroutput"><span class="identifier">X</span><span class="error"></span><span class="special">::</span><span class="error"></span><span class="identifier">reverse_iterator</span></code> 777 </p> 778 </td> 779<td> 780 <p> 781 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">reverse_iterator</span><span class="special"><</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span><span class="special">></span></code> 782 </p> 783 </td> 784<td> 785 </td> 786<td> 787 <p> 788 Compile time only. 789 </p> 790 </td> 791</tr> 792<tr> 793<td> 794 <p> 795 <code class="computeroutput"><span class="identifier">X</span><span class="error"></span><span class="special">::</span><span class="error"></span><span class="identifier">const_reverse_iterator</span></code> 796 </p> 797 </td> 798<td> 799 <p> 800 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">reverse_iterator</span><span class="special"><</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_iterator</span><span class="special">></span></code> 801 </p> 802 </td> 803<td> 804 </td> 805<td> 806 <p> 807 Compile time only. 808 </p> 809 </td> 810</tr> 811</tbody> 812</table></div> 813</div> 814<br class="table-break"><p> 815 If you provide the types and operations above, <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 816 will provide the rest of the reversible container requirements, using this 817 mapping: 818 </p> 819<div class="table"> 820<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.t3"></a><p class="title"><b>Table 38.6. User-Defined Operations to sequence_container_interface Operations</b></p> 821<div class="table-contents"><table class="table" summary="User-Defined Operations to sequence_container_interface Operations"> 822<colgroup> 823<col> 824<col> 825<col> 826</colgroup> 827<thead><tr> 828<th> 829 <p> 830 User-Defined 831 </p> 832 </th> 833<th> 834 <p> 835 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>-Provided 836 </p> 837 </th> 838<th> 839 <p> 840 Note 841 </p> 842 </th> 843</tr></thead> 844<tbody><tr> 845<td> 846 <p> 847</p> 848<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span> 849<span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></pre> 850<p> 851 </p> 852 </td> 853<td> 854 <p> 855</p> 856<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">()</span> 857<span class="identifier">a</span><span class="special">.</span><span class="identifier">rend</span><span class="special">()</span> 858<span class="identifier">a</span><span class="special">.</span><span class="identifier">crbegin</span><span class="special">()</span> 859<span class="identifier">a</span><span class="special">.</span><span class="identifier">crend</span><span class="special">()</span></pre> 860<p> 861 </p> 862 </td> 863<td> 864 <p> 865 The user-defined <code class="computeroutput"><span class="identifier">begin</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">end</span><span class="special">()</span></code> are non-<code class="computeroutput"><span class="keyword">const</span></code>, 866 and <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 867 provides both <code class="computeroutput"><span class="keyword">const</span></code> 868 and non-<code class="computeroutput"><span class="keyword">const</span></code> overloads 869 of <code class="computeroutput"><span class="identifier">rbegin</span><span class="special">()</span></code> 870 and <code class="computeroutput"><span class="identifier">rend</span><span class="special">()</span></code>. 871 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 872 can only provide these operations if <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code> 873 and <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_iterator</span></code> are bidirectional 874 iterators. 875 </p> 876 </td> 877</tr></tbody> 878</table></div> 879</div> 880<br class="table-break"><h4> 881<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h6"></a> 882 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.optional_container_operations"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.optional_container_operations">Optional 883 Container Operations</a> 884 </h4> 885<p> 886 Containers that are comparable with <code class="computeroutput"><span class="special"><</span></code>, 887 <code class="computeroutput"><span class="special">></span></code>, <code class="computeroutput"><span class="special"><=</span></code>, 888 and <code class="computeroutput"><span class="special">>=</span></code> get those operations 889 automatically, so long as <code class="computeroutput"><span class="identifier">T</span></code> 890 is less-than comparable. In this case, there are no required user-defined operations, 891 so that table is not needed. 892 </p> 893<p> 894 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 895 will provide the optional container requirements using this mapping: 896 </p> 897<div class="table"> 898<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.t4"></a><p class="title"><b>Table 38.7. User-Defined Operations to sequence_container_interface Operations</b></p> 899<div class="table-contents"><table class="table" summary="User-Defined Operations to sequence_container_interface Operations"> 900<colgroup> 901<col> 902<col> 903<col> 904</colgroup> 905<thead><tr> 906<th> 907 <p> 908 User-Defined 909 </p> 910 </th> 911<th> 912 <p> 913 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>-Provided 914 </p> 915 </th> 916<th> 917 <p> 918 Note 919 </p> 920 </th> 921</tr></thead> 922<tbody><tr> 923<td> 924 <p> 925 <code class="computeroutput"><span class="identifier">a</span> <span class="special"><</span> 926 <span class="identifier">b</span></code> 927 </p> 928 </td> 929<td> 930 <p> 931</p> 932<pre class="programlisting"><span class="identifier">a</span> <span class="special"><=</span> <span class="identifier">b</span> 933<span class="identifier">a</span> <span class="special">></span> <span class="identifier">b</span> 934<span class="identifier">a</span> <span class="special">>=</span> <span class="identifier">b</span></pre> 935<p> 936 </p> 937 </td> 938<td> 939 <p> 940 Though <code class="computeroutput"><span class="identifier">a</span> <span class="special"><</span> 941 <span class="identifier">b</span></code> is provided by <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>, 942 any user-defined replacement will be used to provide the other operations 943 listed here. 944 </p> 945 </td> 946</tr></tbody> 947</table></div> 948</div> 949<br class="table-break"><h4> 950<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h7"></a> 951 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.sequence_container"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.sequence_container">Sequence 952 Container</a> 953 </h4> 954<p> 955 Sequence containers meet the requirements of this table (in addition to the 956 container requirements): 957 </p> 958<div class="table"> 959<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.t5"></a><p class="title"><b>Table 38.8. User-Defined Types and Operations for Sequence Containers</b></p> 960<div class="table-contents"><table class="table" summary="User-Defined Types and Operations for Sequence Containers"> 961<colgroup> 962<col> 963<col> 964<col> 965<col> 966</colgroup> 967<thead><tr> 968<th> 969 <p> 970 Expression 971 </p> 972 </th> 973<th> 974 <p> 975 Return Type 976 </p> 977 </th> 978<th> 979 <p> 980 Semantics 981 </p> 982 </th> 983<th> 984 <p> 985 Assertion/note/pre-/post-condition 986 </p> 987 </th> 988</tr></thead> 989<tbody> 990<tr> 991<td> 992 <p> 993 <code class="computeroutput"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">t</span><span class="special">);</span></code> 994 </p> 995 </td> 996<td> 997 </td> 998<td> 999 <p> 1000 Constructs a sequence of <code class="computeroutput"><span class="identifier">n</span></code> 1001 copies of <code class="computeroutput"><span class="identifier">t</span></code>. 1002 </p> 1003 </td> 1004<td> 1005 <p> 1006 <span class="emphasis"><em>Ensures:</em></span> <code class="computeroutput"><span class="identifier">distance</span><span class="special">(</span><span class="identifier">u</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="identifier">n</span></code> 1007 </p> 1008 </td> 1009</tr> 1010<tr> 1011<td> 1012 <p> 1013 <code class="computeroutput"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">);</span></code> 1014 </p> 1015 </td> 1016<td> 1017 </td> 1018<td> 1019 <p> 1020 Constructs a sequence equal to <code class="computeroutput"><span class="special">[</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span></code>. 1021 </p> 1022 </td> 1023<td> 1024 <p> 1025 <span class="emphasis"><em>Ensures:</em></span> <code class="computeroutput"><span class="identifier">distance</span><span class="special">(</span><span class="identifier">u</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="identifier">distance</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span></code> 1026 </p> 1027 </td> 1028</tr> 1029<tr> 1030<td> 1031 <p> 1032 <code class="computeroutput"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">il</span><span class="special">);</span></code> 1033 </p> 1034 </td> 1035<td> 1036 </td> 1037<td> 1038 <p> 1039 <code class="computeroutput"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">il</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">il</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span></code> 1040 </p> 1041 </td> 1042<td> 1043 </td> 1044</tr> 1045<tr> 1046<td> 1047 <p> 1048 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">args</span><span class="special">)</span></code> 1049 </p> 1050 </td> 1051<td> 1052 <p> 1053 <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code> 1054 </p> 1055 </td> 1056<td> 1057 <p> 1058 Inserts an object of type T constructed with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...</span></code> before <code class="computeroutput"><span class="identifier">p</span></code>. 1059 </p> 1060 </td> 1061<td> 1062 <p> 1063 <code class="computeroutput"><span class="identifier">args</span></code> may directly 1064 or indirectly refer to a value in <code class="computeroutput"><span class="identifier">a</span></code>. 1065 </p> 1066 </td> 1067</tr> 1068<tr> 1069<td> 1070 <p> 1071 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span></code> 1072 </p> 1073 </td> 1074<td> 1075 <p> 1076 <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code> 1077 </p> 1078 </td> 1079<td> 1080 <p> 1081 Inserts copies of the elements in <code class="computeroutput"><span class="special">[</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span></code> 1082 before <code class="computeroutput"><span class="identifier">p</span></code>. 1083 </p> 1084 </td> 1085<td> 1086 </td> 1087</tr> 1088<tr> 1089<td> 1090 <p> 1091 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span></code> 1092 </p> 1093 </td> 1094<td> 1095 <p> 1096 <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code> 1097 </p> 1098 </td> 1099<td> 1100 <p> 1101 Erases the elements in the range <code class="computeroutput"><span class="special">[</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span></code>. 1102 </p> 1103 </td> 1104<td> 1105 </td> 1106</tr> 1107</tbody> 1108</table></div> 1109</div> 1110<br class="table-break"><div class="important"><table border="0" summary="Important"> 1111<tr> 1112<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td> 1113<th align="left">Important</th> 1114</tr> 1115<tr><td align="left" valign="top"><p> 1116 In the notes for <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">args</span><span class="special">)</span></code>, it says: "<code class="computeroutput"><span class="identifier">args</span></code> 1117 may directly or indirectly refer to a value in <code class="computeroutput"><span class="identifier">a</span></code>". 1118 Don't forget to handle that case in your implementation. Otherwise, <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">back</span><span class="special">())</span></code> may do the wrong thing. 1119 </p></td></tr> 1120</table></div> 1121<p> 1122 If you provide the types and operations above, <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1123 will provide the rest of the sequence container requirements, using this mapping: 1124 </p> 1125<div class="table"> 1126<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.t6"></a><p class="title"><b>Table 38.9. User-Defined Operations to sequence_container_interface Operations</b></p> 1127<div class="table-contents"><table class="table" summary="User-Defined Operations to sequence_container_interface Operations"> 1128<colgroup> 1129<col> 1130<col> 1131<col> 1132</colgroup> 1133<thead><tr> 1134<th> 1135 <p> 1136 User-Defined 1137 </p> 1138 </th> 1139<th> 1140 <p> 1141 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>-Provided 1142 </p> 1143 </th> 1144<th> 1145 <p> 1146 Note 1147 </p> 1148 </th> 1149</tr></thead> 1150<tbody> 1151<tr> 1152<td> 1153 <p> 1154 <code class="computeroutput"><span class="identifier">X</span><span class="special">(</span><span class="identifier">il</span><span class="special">)</span></code> 1155 </p> 1156 </td> 1157<td> 1158 <p> 1159 <code class="computeroutput"><span class="identifier">a</span> <span class="special">=</span> 1160 <span class="identifier">il</span></code> 1161 </p> 1162 </td> 1163<td> 1164 </td> 1165</tr> 1166<tr> 1167<td> 1168 <p> 1169 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">args</span><span class="special">)</span></code> 1170 </p> 1171 </td> 1172<td> 1173 <p> 1174</p> 1175<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">t</span><span class="special">)</span> 1176<span class="identifier">a</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">rv</span><span class="special">)</span></pre> 1177<p> 1178 </p> 1179 </td> 1180<td> 1181 </td> 1182</tr> 1183<tr> 1184<td> 1185 <p> 1186 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span></code> 1187 </p> 1188 </td> 1189<td> 1190 <p> 1191</p> 1192<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">t</span><span class="special">)</span> 1193<span class="identifier">a</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">il</span><span class="special">)</span></pre> 1194<p> 1195 </p> 1196 </td> 1197<td> 1198 </td> 1199</tr> 1200<tr> 1201<td> 1202 <p> 1203 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span></code> 1204 </p> 1205 </td> 1206<td> 1207 <p> 1208</p> 1209<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q</span><span class="special">)</span> 1210<span class="identifier">a</span><span class="special">.</span><span class="identifier">clear</span><span class="special">()</span></pre> 1211<p> 1212 </p> 1213 </td> 1214<td> 1215 </td> 1216</tr> 1217<tr> 1218<td> 1219 <p> 1220</p> 1221<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span> 1222<span class="identifier">a</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span></pre> 1223<p> 1224 </p> 1225 </td> 1226<td> 1227 <p> 1228</p> 1229<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span> 1230<span class="identifier">a</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">t</span><span class="special">)</span> 1231<span class="identifier">a</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">il</span><span class="special">)</span></pre> 1232<p> 1233 </p> 1234 </td> 1235<td> 1236 <p> 1237 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span></code> 1238 and <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span></code> 1239 must both be user-defined for <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1240 to provide these operations. 1241 </p> 1242 </td> 1243</tr> 1244</tbody> 1245</table></div> 1246</div> 1247<br class="table-break"><h4> 1248<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h8"></a> 1249 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.optional_sequence_container_operations"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.optional_sequence_container_operations">Optional 1250 Sequence Container Operations</a> 1251 </h4> 1252<p> 1253 Sequence containers with <code class="computeroutput"><span class="identifier">front</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">back</span><span class="special">()</span></code>, or any of the other operations in this table 1254 must define these operations (in addition to the container requirements): 1255 </p> 1256<div class="table"> 1257<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.t7"></a><p class="title"><b>Table 38.10. User-Defined Types and Operations for Sequence Containers</b></p> 1258<div class="table-contents"><table class="table" summary="User-Defined Types and Operations for Sequence Containers"> 1259<colgroup> 1260<col> 1261<col> 1262<col> 1263<col> 1264</colgroup> 1265<thead><tr> 1266<th> 1267 <p> 1268 Expression 1269 </p> 1270 </th> 1271<th> 1272 <p> 1273 Return Type 1274 </p> 1275 </th> 1276<th> 1277 <p> 1278 Semantics 1279 </p> 1280 </th> 1281<th> 1282 <p> 1283 Assertion/note/pre-/post-condition 1284 </p> 1285 </th> 1286</tr></thead> 1287<tbody> 1288<tr> 1289<td> 1290 <p> 1291 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace_front</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code> 1292 </p> 1293 </td> 1294<td> 1295 <p> 1296 <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">reference</span></code> 1297 </p> 1298 </td> 1299<td> 1300 <p> 1301 Prepends an object of type <code class="computeroutput"><span class="identifier">T</span></code> 1302 constructed with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...</span></code>. 1303 </p> 1304 </td> 1305<td> 1306 </td> 1307</tr> 1308<tr> 1309<td> 1310 <p> 1311 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code> 1312 </p> 1313 </td> 1314<td> 1315 <p> 1316 <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">reference</span></code> 1317 </p> 1318 </td> 1319<td> 1320 <p> 1321 Appends an object of type <code class="computeroutput"><span class="identifier">T</span></code> 1322 constructed with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...</span></code>. 1323 </p> 1324 </td> 1325<td> 1326 </td> 1327</tr> 1328</tbody> 1329</table></div> 1330</div> 1331<br class="table-break"><p> 1332 If you provide the types and operations above, <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1333 will provide the rest of the optional sequence container requirements, using 1334 this mapping: 1335 </p> 1336<div class="table"> 1337<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.t8"></a><p class="title"><b>Table 38.11. User-Defined Operations to sequence_container_interface Operations</b></p> 1338<div class="table-contents"><table class="table" summary="User-Defined Operations to sequence_container_interface Operations"> 1339<colgroup> 1340<col> 1341<col> 1342<col> 1343</colgroup> 1344<thead><tr> 1345<th> 1346 <p> 1347 User-Defined 1348 </p> 1349 </th> 1350<th> 1351 <p> 1352 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>-Provided 1353 </p> 1354 </th> 1355<th> 1356 <p> 1357 Note 1358 </p> 1359 </th> 1360</tr></thead> 1361<tbody> 1362<tr> 1363<td> 1364 <p> 1365 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span></code> 1366 </p> 1367 </td> 1368<td> 1369 <p> 1370</p> 1371<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">front</span><span class="special">()</span> 1372<span class="identifier">a</span><span class="special">[</span><span class="identifier">n</span><span class="special">]</span> 1373<span class="identifier">a</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span> 1374</pre> 1375<p> 1376 </p> 1377 </td> 1378<td> 1379 <p> 1380 These operations are provided in <code class="computeroutput"><span class="keyword">const</span></code> 1381 and non-<code class="computeroutput"><span class="keyword">const</span></code> overloads. 1382 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1383 can only provide <code class="computeroutput"><span class="identifier">a</span><span class="special">[</span><span class="identifier">n</span><span class="special">]</span></code> and <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code> if <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code> 1384 and <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_iterator</span></code> are random access 1385 iterators. 1386 </p> 1387 </td> 1388</tr> 1389<tr> 1390<td> 1391 <p> 1392 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></code> 1393 </p> 1394 </td> 1395<td> 1396 <p> 1397 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">back</span><span class="special">()</span></code> 1398 </p> 1399 </td> 1400<td> 1401 <p> 1402 <code class="computeroutput"><span class="identifier">back</span><span class="special">()</span></code> 1403 is provided in <code class="computeroutput"><span class="keyword">const</span></code> 1404 and non-<code class="computeroutput"><span class="keyword">const</span></code> overloads. 1405 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1406 can only provide <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">back</span><span class="special">()</span></code> if <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">iterator</span></code> 1407 and <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_iterator</span></code> are bidirectional 1408 iterators. 1409 </p> 1410 </td> 1411</tr> 1412<tr> 1413<td> 1414 <p> 1415 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace_front</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code> 1416 </p> 1417 </td> 1418<td> 1419 <p> 1420</p> 1421<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">push_front</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span> 1422<span class="identifier">a</span><span class="special">.</span><span class="identifier">push_front</span><span class="special">(</span><span class="identifier">rv</span><span class="special">)</span> 1423</pre> 1424<p> 1425 </p> 1426 </td> 1427<td> 1428 </td> 1429</tr> 1430<tr> 1431<td> 1432 <p> 1433 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code> 1434 </p> 1435 </td> 1436<td> 1437 <p> 1438</p> 1439<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span> 1440<span class="identifier">a</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">rv</span><span class="special">)</span> 1441</pre> 1442<p> 1443 </p> 1444 </td> 1445<td> 1446 </td> 1447</tr> 1448<tr> 1449<td> 1450 <p> 1451</p> 1452<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace_front</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span> 1453<span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span></pre> 1454<p> 1455 </p> 1456 </td> 1457<td> 1458 <p> 1459 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">pop_front</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> 1460 </p> 1461 </td> 1462<td> 1463 <p> 1464 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace_front</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code> 1465 and <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span></code> 1466 must both be user-defined for <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1467 to provide this operation. 1468 </p> 1469 </td> 1470</tr> 1471<tr> 1472<td> 1473 <p> 1474</p> 1475<pre class="programlisting"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span> 1476<span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span></pre> 1477<p> 1478 </p> 1479 </td> 1480<td> 1481 <p> 1482 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> 1483 </p> 1484 </td> 1485<td> 1486 <p> 1487 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace_front</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code> 1488 and <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q1</span><span class="special">,</span> <span class="identifier">q2</span><span class="special">)</span></code> 1489 must both be user-defined for <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1490 to provide this operation. 1491 </p> 1492 </td> 1493</tr> 1494</tbody> 1495</table></div> 1496</div> 1497<br class="table-break"><div class="note"><table border="0" summary="Note"> 1498<tr> 1499<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 1500<th align="left">Note</th> 1501</tr> 1502<tr><td align="left" valign="top"><p> 1503 <code class="computeroutput"><span class="identifier">emplace_front</span><span class="special">()</span></code> 1504 and <code class="computeroutput"><span class="identifier">emplace_back</span><span class="special">()</span></code> 1505 are not needed for some of the <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>-provided 1506 operations above (e.g. <code class="computeroutput"><span class="identifier">pop_front</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">pop_back</span><span class="special">()</span></code>, respectively). However, they are each 1507 used as the user-defined operation that indicates that the container being 1508 defined is front- or back-mutation-friendly. 1509 </p></td></tr> 1510</table></div> 1511<h4> 1512<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h9"></a> 1513 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.general_requirements_on_all_user_defined_operations"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.general_requirements_on_all_user_defined_operations">General 1514 Requirements on All User-Defined Operations</a> 1515 </h4> 1516<p> 1517 There are other requirements listed in the standard that do not appear in any 1518 of the requirements tables; user-defined operations must conform to those as 1519 well: 1520 </p> 1521<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1522<li class="listitem"> 1523 If an exception is thrown by an <code class="computeroutput"><span class="identifier">insert</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">emplace</span><span class="special">()</span></code> call while inserting a single element, 1524 that function has no effect. 1525 </li> 1526<li class="listitem"> 1527 No <code class="computeroutput"><span class="identifier">erase</span><span class="special">()</span></code> 1528 function throws an exception. 1529 </li> 1530<li class="listitem"> 1531 No copy constructor or assignment operator of a returned iterator throws 1532 an exception. 1533 </li> 1534<li class="listitem"> 1535 The iterator returned from <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> 1536 <span class="identifier">args</span><span class="special">)</span></code> 1537 points to the new element constructed from <code class="computeroutput"><span class="identifier">args</span></code> 1538 into <code class="computeroutput"><span class="identifier">a</span></code>. 1539 </li> 1540<li class="listitem"> 1541 The iterator returned from <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> 1542 <span class="identifier">i</span><span class="special">,</span> 1543 <span class="identifier">j</span><span class="special">)</span></code> 1544 points to the copy of the first element inserted into <code class="computeroutput"><span class="identifier">a</span></code>, 1545 or <code class="computeroutput"><span class="identifier">p</span></code> if <code class="computeroutput"><span class="identifier">i</span> 1546 <span class="special">==</span> <span class="identifier">j</span></code>. 1547 </li> 1548<li class="listitem"> 1549 The iterator returned by <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">q1</span><span class="special">,</span> 1550 <span class="identifier">q2</span><span class="special">)</span></code> 1551 points to the element pointed to by <code class="computeroutput"><span class="identifier">q2</span></code> 1552 prior to any elements being erased. If no such element exists, <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></code> is returned. 1553 </li> 1554</ul></div> 1555<h4> 1556<a name="boost_stlinterfaces.tutorial___sequence_container_interface_.h10"></a> 1557 <span class="phrase"><a name="boost_stlinterfaces.tutorial___sequence_container_interface_.example___code__phrase_role__identifier__static_vector__phrase___code_"></a></span><a class="link" href="tutorial___sequence_container_interface_.html#boost_stlinterfaces.tutorial___sequence_container_interface_.example___code__phrase_role__identifier__static_vector__phrase___code_">Example: 1558 <code class="computeroutput"><span class="identifier">static_vector</span></code></a> 1559 </h4> 1560<p> 1561 Let's look at an example. <a href="https://www.boost.org/doc/libs/release/libs/container" target="_top">Boost.Container</a> 1562 contains a template called <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">container</span><span class="special">::</span><span class="identifier">static_vector</span></code>, 1563 which is a fixed-capacity vector that does not allocate from the heap. We have 1564 a similar template in this example, <code class="computeroutput"><span class="identifier">static_vector</span></code>. 1565 It is implemented by deriving from <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>, 1566 which provides much of the API specified in the STL, based on a subset of the 1567 API that the user must provide. 1568 </p> 1569<p> 1570 <code class="computeroutput"><span class="identifier">static_vector</span></code> meets all the 1571 sequence container requirements (including many of the optional ones) and reversible 1572 container requirements in the standard. It does not meet the allocator-aware 1573 container requirements, since it does not allocate. In short, it has the same 1574 full API as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>, without all the allocatory bits. 1575 </p> 1576<p> 1577</p> 1578<pre class="programlisting"><span class="comment">// The sections of member functions below are commented as they are in the</span> 1579<span class="comment">// standard for std::vector. Each section has two numbers: the number of</span> 1580<span class="comment">// member functions in that section, and the number that are missing, because</span> 1581<span class="comment">// they are provided by sequence_container_interface. The purely</span> 1582<span class="comment">// allocator-specific members are neither present nor part of the counts.</span> 1583<span class="comment">//</span> 1584<span class="comment">// We're passing boost::stl_interfaces::contiguous here, so that</span> 1585<span class="comment">// sequence_container_interface knows that it should provide data().</span> 1586<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">></span> 1587<span class="keyword">struct</span> <span class="identifier">static_vector</span> <span class="special">:</span> <span class="identifier">sequence_container_interface</span><span class="special"><</span> 1588 <span class="identifier">static_vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">>,</span> 1589 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">element_layout</span><span class="special">::</span><span class="identifier">contiguous</span><span class="special">></span> 1590<span class="special">{</span> 1591 <span class="comment">// These are the types required for reversible containers. These must be</span> 1592 <span class="comment">// user-defined.</span> 1593 <span class="keyword">using</span> <span class="identifier">value_type</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">;</span> 1594 <span class="keyword">using</span> <span class="identifier">pointer</span> <span class="special">=</span> <span class="identifier">T</span> <span class="special">*;</span> 1595 <span class="keyword">using</span> <span class="identifier">const_pointer</span> <span class="special">=</span> <span class="identifier">T</span> <span class="keyword">const</span> <span class="special">*;</span> 1596 <span class="keyword">using</span> <span class="identifier">reference</span> <span class="special">=</span> <span class="identifier">value_type</span> <span class="special">&;</span> 1597 <span class="keyword">using</span> <span class="identifier">const_reference</span> <span class="special">=</span> <span class="identifier">value_type</span> <span class="keyword">const</span> <span class="special">&;</span> 1598 <span class="keyword">using</span> <span class="identifier">size_type</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">;</span> 1599 <span class="keyword">using</span> <span class="identifier">difference_type</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ptrdiff_t</span><span class="special">;</span> 1600 <span class="keyword">using</span> <span class="identifier">iterator</span> <span class="special">=</span> <span class="identifier">T</span> <span class="special">*;</span> 1601 <span class="keyword">using</span> <span class="identifier">const_iterator</span> <span class="special">=</span> <span class="identifier">T</span> <span class="keyword">const</span> <span class="special">*;</span> 1602 <span class="keyword">using</span> <span class="identifier">reverse_iterator</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">reverse_iterator</span><span class="special"><</span><span class="identifier">iterator</span><span class="special">>;</span> 1603 <span class="keyword">using</span> <span class="identifier">const_reverse_iterator</span> <span class="special">=</span> 1604 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">reverse_iterator</span><span class="special"><</span><span class="identifier">const_iterator</span><span class="special">>;</span> 1605 1606 <span class="comment">// construct/copy/destroy (9 members, skipped 2)</span> 1607 <span class="comment">//</span> 1608 <span class="comment">// Constructors and special member functions all must be user-provided.</span> 1609 <span class="comment">// Were they provided by sequence_container_interface, everything would break, due</span> 1610 <span class="comment">// to the language rules related to them. However, assignment from</span> 1611 <span class="comment">// std::initializer_list and the destructor can come from</span> 1612 <span class="comment">// sequence_container_interface.</span> 1613 <span class="identifier">static_vector</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">:</span> <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special">{}</span> 1614 <span class="keyword">explicit</span> <span class="identifier">static_vector</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">resize</span><span class="special">(</span><span class="identifier">n</span><span class="special">);</span> <span class="special">}</span> 1615 <span class="keyword">explicit</span> <span class="identifier">static_vector</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> 1616 <span class="special">{</span> 1617 <span class="comment">// Note that you must write "this->" before all the member functions</span> 1618 <span class="comment">// provided by sequence_container_interface, which is slightly annoying.</span> 1619 <span class="keyword">this</span><span class="special">-></span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">x</span><span class="special">);</span> 1620 <span class="special">}</span> 1621 <span class="keyword">template</span><span class="special"><</span> 1622 <span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">,</span> 1623 <span class="keyword">typename</span> <span class="identifier">Enable</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">enable_if_t</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special"><</span> 1624 <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">InputIterator</span><span class="special">>::</span><span class="identifier">iterator_category</span><span class="special">,</span> 1625 <span class="identifier">std</span><span class="special">::</span><span class="identifier">input_iterator_tag</span><span class="special">>::</span><span class="identifier">value</span><span class="special">>></span> 1626 <span class="identifier">static_vector</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> 1627 <span class="special">{</span> 1628 <span class="keyword">this</span><span class="special">-></span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span> 1629 <span class="special">}</span> 1630 <span class="identifier">static_vector</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">initializer_list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">il</span><span class="special">)</span> <span class="special">:</span> 1631 <span class="identifier">static_vector</span><span class="special">(</span><span class="identifier">il</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">il</span><span class="special">.</span><span class="identifier">end</span><span class="special">())</span> 1632 <span class="special">{}</span> 1633 <span class="identifier">static_vector</span><span class="special">(</span><span class="identifier">static_vector</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> 1634 <span class="special">{</span> 1635 <span class="keyword">this</span><span class="special">-></span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span> 1636 <span class="special">}</span> 1637 <span class="identifier">static_vector</span><span class="special">(</span><span class="identifier">static_vector</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span> 1638 <span class="keyword">noexcept</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">declval</span><span class="special"><</span><span class="identifier">static_vector</span><span class="special">>().</span><span class="identifier">emplace_back</span><span class="special">(</span> 1639 <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()))))</span> <span class="special">:</span> 1640 <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> 1641 <span class="special">{</span> 1642 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span> <span class="special">&</span> <span class="identifier">element</span> <span class="special">:</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">{</span> 1643 <span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">element</span><span class="special">));</span> 1644 <span class="special">}</span> 1645 <span class="identifier">other</span><span class="special">.</span><span class="identifier">clear</span><span class="special">();</span> 1646 <span class="special">}</span> 1647 <span class="identifier">static_vector</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">static_vector</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> 1648 <span class="special">{</span> 1649 <span class="keyword">this</span><span class="special">-></span><span class="identifier">clear</span><span class="special">();</span> 1650 <span class="keyword">this</span><span class="special">-></span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span> 1651 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 1652 <span class="special">}</span> 1653 <span class="identifier">static_vector</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">static_vector</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="keyword">noexcept</span><span class="special">(</span> 1654 <span class="identifier">std</span><span class="special">::</span><span class="identifier">declval</span><span class="special"><</span><span class="identifier">static_vector</span><span class="special">>().</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()))))</span> 1655 <span class="special">{</span> 1656 <span class="keyword">this</span><span class="special">-></span><span class="identifier">clear</span><span class="special">();</span> 1657 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span> <span class="special">&</span> <span class="identifier">element</span> <span class="special">:</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">{</span> 1658 <span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">element</span><span class="special">));</span> 1659 <span class="special">}</span> 1660 <span class="identifier">other</span><span class="special">.</span><span class="identifier">clear</span><span class="special">();</span> 1661 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 1662 <span class="special">}</span> 1663 <span class="special">~</span><span class="identifier">static_vector</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">this</span><span class="special">-></span><span class="identifier">clear</span><span class="special">();</span> <span class="special">}</span> 1664 1665 <span class="comment">// iterators (2 members, skipped 10)</span> 1666 <span class="comment">//</span> 1667 <span class="comment">// This section is the first big win. Instead of having to write 12</span> 1668 <span class="comment">// overloads line begin, cbegin, rbegin, crbegin, etc., we can just write</span> 1669 <span class="comment">// 2.</span> 1670 <span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">{</span> <span class="keyword">return</span> <span class="keyword">reinterpret_cast</span><span class="special"><</span><span class="identifier">T</span> <span class="special">*>(</span><span class="identifier">buf_</span><span class="special">);</span> <span class="special">}</span> 1671 <span class="identifier">iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">noexcept</span> 1672 <span class="special">{</span> 1673 <span class="keyword">return</span> <span class="keyword">reinterpret_cast</span><span class="special"><</span><span class="identifier">T</span> <span class="special">*>(</span><span class="identifier">buf_</span> <span class="special">+</span> <span class="identifier">size_</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">));</span> 1674 <span class="special">}</span> 1675 1676 <span class="comment">// capacity (6 members, skipped 2)</span> 1677 <span class="comment">//</span> 1678 <span class="comment">// Most of these are not even part of the general requirements, because</span> 1679 <span class="comment">// some are specific to std::vector and related types. However, we do get</span> 1680 <span class="comment">// empty and size from sequence_container_interface.</span> 1681 <span class="identifier">size_type</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">N</span><span class="special">;</span> <span class="special">}</span> 1682 <span class="identifier">size_type</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">N</span><span class="special">;</span> <span class="special">}</span> 1683 <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">sz</span><span class="special">)</span> <span class="keyword">noexcept</span> 1684 <span class="special">{</span> 1685 <span class="identifier">resize_impl</span><span class="special">(</span><span class="identifier">sz</span><span class="special">,</span> <span class="special">[]</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">T</span><span class="special">();</span> <span class="special">});</span> 1686 <span class="special">}</span> 1687 <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">sz</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">noexcept</span> 1688 <span class="special">{</span> 1689 <span class="identifier">resize_impl</span><span class="special">(</span><span class="identifier">sz</span><span class="special">,</span> <span class="special">[&]()</span> <span class="special">-></span> <span class="identifier">T</span> <span class="keyword">const</span> <span class="special">&</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">x</span><span class="special">;</span> <span class="special">});</span> 1690 <span class="special">}</span> 1691 <span class="keyword">void</span> <span class="identifier">reserve</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">{</span> <span class="identifier">assert</span><span class="special">(</span><span class="identifier">n</span> <span class="special"><</span> <span class="identifier">capacity</span><span class="special">());</span> <span class="special">}</span> 1692 <span class="keyword">void</span> <span class="identifier">shrink_to_fit</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">{}</span> 1693 1694 <span class="comment">// element access (skipped 8)</span> 1695 <span class="comment">// data access (skipped 2)</span> 1696 <span class="comment">//</span> 1697 <span class="comment">// Another big win. sequence_container_interface provides all of the</span> 1698 <span class="comment">// overloads of operator[], at, front, back, and data.</span> 1699 1700 <span class="comment">// modifiers (5 members, skipped 9)</span> 1701 <span class="comment">//</span> 1702 <span class="comment">// In this section we again get most of the API from</span> 1703 <span class="comment">// sequence_container_interface.</span> 1704 1705 <span class="comment">// emplace_back does not look very necessary -- just look at its trivial</span> 1706 <span class="comment">// implementation -- but we can't provide it from</span> 1707 <span class="comment">// sequence_container_interface, because it is an optional sequence</span> 1708 <span class="comment">// container interface. We would not want emplace_front to suddenly</span> 1709 <span class="comment">// appear on our std::vector-like type, and there may be some other type</span> 1710 <span class="comment">// for which emplace_back is a bad idea.</span> 1711 <span class="comment">//</span> 1712 <span class="comment">// However, by providing emplace_back here, we signal to the</span> 1713 <span class="comment">// sequence_container_interface template that our container is</span> 1714 <span class="comment">// back-mutation-friendly, and this allows it to provide all the overloads</span> 1715 <span class="comment">// of push_back and pop_back.</span> 1716 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span> 1717 <span class="identifier">reference</span> <span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">Args</span> <span class="special">&&...</span> <span class="identifier">args</span><span class="special">)</span> 1718 <span class="special">{</span> 1719 <span class="keyword">return</span> <span class="special">*</span><span class="identifier">emplace</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">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...);</span> 1720 <span class="special">}</span> 1721 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span> 1722 <span class="identifier">iterator</span> <span class="identifier">emplace</span><span class="special">(</span><span class="identifier">const_iterator</span> <span class="identifier">pos</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&...</span> <span class="identifier">args</span><span class="special">)</span> 1723 <span class="special">{</span> 1724 <span class="keyword">auto</span> <span class="identifier">position</span> <span class="special">=</span> <span class="keyword">const_cast</span><span class="special"><</span><span class="identifier">T</span> <span class="special">*>(</span><span class="identifier">pos</span><span class="special">);</span> 1725 <span class="keyword">bool</span> <span class="keyword">const</span> <span class="identifier">insert_before_end</span> <span class="special">=</span> <span class="identifier">position</span> <span class="special"><</span> <span class="identifier">end</span><span class="special">();</span> 1726 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">insert_before_end</span><span class="special">)</span> <span class="special">{</span> 1727 <span class="keyword">auto</span> <span class="identifier">last</span> <span class="special">=</span> <span class="identifier">end</span><span class="special">();</span> 1728 <span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">back</span><span class="special">()));</span> 1729 <span class="identifier">std</span><span class="special">::</span><span class="identifier">move_backward</span><span class="special">(</span><span class="identifier">position</span><span class="special">,</span> <span class="identifier">last</span> <span class="special">-</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span> 1730 <span class="special">}</span> 1731 <span class="keyword">new</span> <span class="special">(</span><span class="identifier">position</span><span class="special">)</span> <span class="identifier">T</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...);</span> 1732 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">insert_before_end</span><span class="special">)</span> 1733 <span class="special">++</span><span class="identifier">size_</span><span class="special">;</span> 1734 <span class="keyword">return</span> <span class="identifier">position</span><span class="special">;</span> 1735 <span class="special">}</span> 1736 <span class="comment">// Note: The iterator category here was upgraded to ForwardIterator</span> 1737 <span class="comment">// (instead of vector's InputIterator), to ensure linear time complexity.</span> 1738 <span class="keyword">template</span><span class="special"><</span> 1739 <span class="keyword">typename</span> <span class="identifier">ForwardIterator</span><span class="special">,</span> 1740 <span class="keyword">typename</span> <span class="identifier">Enable</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">enable_if_t</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special"><</span> 1741 <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">ForwardIterator</span><span class="special">>::</span><span class="identifier">iterator_category</span><span class="special">,</span> 1742 <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward_iterator_tag</span><span class="special">>::</span><span class="identifier">value</span><span class="special">>></span> 1743 <span class="identifier">iterator</span> 1744 <span class="identifier">insert</span><span class="special">(</span><span class="identifier">const_iterator</span> <span class="identifier">pos</span><span class="special">,</span> <span class="identifier">ForwardIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">ForwardIterator</span> <span class="identifier">last</span><span class="special">)</span> 1745 <span class="special">{</span> 1746 <span class="keyword">auto</span> <span class="identifier">position</span> <span class="special">=</span> <span class="keyword">const_cast</span><span class="special"><</span><span class="identifier">T</span> <span class="special">*>(</span><span class="identifier">pos</span><span class="special">);</span> 1747 <span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">insertions</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span> 1748 <span class="identifier">assert</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">insertions</span> <span class="special"><</span> <span class="identifier">capacity</span><span class="special">());</span> 1749 <span class="identifier">uninitialized_generate</span><span class="special">(</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">insertions</span><span class="special">,</span> <span class="special">[]</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">T</span><span class="special">();</span> <span class="special">});</span> 1750 <span class="identifier">std</span><span class="special">::</span><span class="identifier">move_backward</span><span class="special">(</span><span class="identifier">position</span><span class="special">,</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">insertions</span><span class="special">);</span> 1751 <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</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="identifier">position</span><span class="special">);</span> 1752 <span class="identifier">size_</span> <span class="special">+=</span> <span class="identifier">insertions</span><span class="special">;</span> 1753 <span class="keyword">return</span> <span class="identifier">position</span><span class="special">;</span> 1754 <span class="special">}</span> 1755 <span class="identifier">iterator</span> <span class="identifier">erase</span><span class="special">(</span><span class="identifier">const_iterator</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">const_iterator</span> <span class="identifier">l</span><span class="special">)</span> 1756 <span class="special">{</span> 1757 <span class="keyword">auto</span> <span class="identifier">first</span> <span class="special">=</span> <span class="keyword">const_cast</span><span class="special"><</span><span class="identifier">T</span> <span class="special">*>(</span><span class="identifier">f</span><span class="special">);</span> 1758 <span class="keyword">auto</span> <span class="identifier">last</span> <span class="special">=</span> <span class="keyword">const_cast</span><span class="special"><</span><span class="identifier">T</span> <span class="special">*>(</span><span class="identifier">l</span><span class="special">);</span> 1759 <span class="keyword">auto</span> <span class="identifier">end_</span> <span class="special">=</span> <span class="keyword">this</span><span class="special">-></span><span class="identifier">end</span><span class="special">();</span> 1760 <span class="keyword">auto</span> <span class="identifier">it</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">last</span><span class="special">,</span> <span class="identifier">end_</span><span class="special">,</span> <span class="identifier">first</span><span class="special">);</span> 1761 <span class="keyword">for</span> <span class="special">(;</span> <span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">end_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">it</span><span class="special">)</span> <span class="special">{</span> 1762 <span class="identifier">it</span><span class="special">->~</span><span class="identifier">T</span><span class="special">();</span> 1763 <span class="special">}</span> 1764 <span class="identifier">size_</span> <span class="special">-=</span> <span class="identifier">last</span> <span class="special">-</span> <span class="identifier">first</span><span class="special">;</span> 1765 <span class="keyword">return</span> <span class="identifier">first</span><span class="special">;</span> 1766 <span class="special">}</span> 1767 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">static_vector</span> <span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> 1768 <span class="special">{</span> 1769 <span class="identifier">size_type</span> <span class="identifier">short_size</span><span class="special">,</span> <span class="identifier">long_size</span><span class="special">;</span> 1770 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">short_size</span><span class="special">,</span> <span class="identifier">long_size</span><span class="special">)</span> <span class="special">=</span> 1771 <span class="identifier">std</span><span class="special">::</span><span class="identifier">minmax</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">size</span><span class="special">(),</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">size</span><span class="special">());</span> 1772 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">size_type</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">short_size</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 1773 <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span><span class="special">;</span> 1774 <span class="identifier">swap</span><span class="special">((*</span><span class="keyword">this</span><span class="special">)[</span><span class="identifier">i</span><span class="special">],</span> <span class="identifier">other</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span> 1775 <span class="special">}</span> 1776 1777 <span class="identifier">static_vector</span> <span class="special">*</span> <span class="identifier">longer</span> <span class="special">=</span> <span class="keyword">this</span><span class="special">;</span> 1778 <span class="identifier">static_vector</span> <span class="special">*</span> <span class="identifier">shorter</span> <span class="special">=</span> <span class="keyword">this</span><span class="special">;</span> 1779 <span class="keyword">if</span> <span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">size</span><span class="special">())</span> 1780 <span class="identifier">longer</span> <span class="special">=</span> <span class="special">&</span><span class="identifier">other</span><span class="special">;</span> 1781 <span class="keyword">else</span> 1782 <span class="identifier">shorter</span> <span class="special">=</span> <span class="special">&</span><span class="identifier">other</span><span class="special">;</span> 1783 1784 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span> <span class="identifier">it</span> <span class="special">=</span> <span class="identifier">longer</span><span class="special">-></span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">short_size</span><span class="special">,</span> <span class="identifier">last</span> <span class="special">=</span> <span class="identifier">longer</span><span class="special">-></span><span class="identifier">end</span><span class="special">();</span> 1785 <span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">last</span><span class="special">;</span> 1786 <span class="special">++</span><span class="identifier">it</span><span class="special">)</span> <span class="special">{</span> 1787 <span class="identifier">shorter</span><span class="special">-></span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">it</span><span class="special">));</span> 1788 <span class="special">}</span> 1789 1790 <span class="identifier">longer</span><span class="special">-></span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">short_size</span><span class="special">);</span> 1791 <span class="identifier">shorter</span><span class="special">-></span><span class="identifier">size_</span> <span class="special">=</span> <span class="identifier">long_size</span><span class="special">;</span> 1792 <span class="special">}</span> 1793 1794 <span class="comment">// Since we're getting so many overloads from</span> 1795 <span class="comment">// sequence_container_interface, and since many of those overloads are</span> 1796 <span class="comment">// implemented in terms of a user-defined function of the same name, we</span> 1797 <span class="comment">// need to add quite a few using declarations here.</span> 1798 <span class="keyword">using</span> <span class="identifier">base_type</span> <span class="special">=</span> <span class="identifier">sequence_container_interface</span><span class="special"><</span> 1799 <span class="identifier">static_vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">>,</span> 1800 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">element_layout</span><span class="special">::</span><span class="identifier">contiguous</span><span class="special">>;</span> 1801 <span class="keyword">using</span> <span class="identifier">base_type</span><span class="special">::</span><span class="identifier">begin</span><span class="special">;</span> 1802 <span class="keyword">using</span> <span class="identifier">base_type</span><span class="special">::</span><span class="identifier">end</span><span class="special">;</span> 1803 <span class="keyword">using</span> <span class="identifier">base_type</span><span class="special">::</span><span class="identifier">insert</span><span class="special">;</span> 1804 <span class="keyword">using</span> <span class="identifier">base_type</span><span class="special">::</span><span class="identifier">erase</span><span class="special">;</span> 1805 1806 <span class="comment">// comparisons (skipped 6)</span> 1807 1808<span class="keyword">private</span><span class="special">:</span> 1809 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 1810 <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">uninitialized_generate</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">iterator</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">func</span><span class="special">)</span> 1811 <span class="special">{</span> 1812 <span class="keyword">for</span> <span class="special">(;</span> <span class="identifier">f</span> <span class="special">!=</span> <span class="identifier">l</span><span class="special">;</span> <span class="special">++</span><span class="identifier">f</span><span class="special">)</span> <span class="special">{</span> 1813 <span class="keyword">new</span> <span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">void</span> <span class="special">*>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)))</span> <span class="identifier">T</span><span class="special">(</span><span class="identifier">func</span><span class="special">());</span> 1814 <span class="special">}</span> 1815 <span class="special">}</span> 1816 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 1817 <span class="keyword">void</span> <span class="identifier">resize_impl</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">sz</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">noexcept</span> 1818 <span class="special">{</span> 1819 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">sz</span> <span class="special"><</span> <span class="identifier">capacity</span><span class="special">());</span> 1820 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">sz</span> <span class="special"><</span> <span class="keyword">this</span><span class="special">-></span><span class="identifier">size</span><span class="special">())</span> 1821 <span class="identifier">erase</span><span class="special">(</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">sz</span><span class="special">,</span> <span class="identifier">end</span><span class="special">());</span> 1822 <span class="keyword">if</span> <span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">sz</span><span class="special">)</span> 1823 <span class="identifier">uninitialized_generate</span><span class="special">(</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">sz</span><span class="special">,</span> <span class="identifier">func</span><span class="special">);</span> 1824 <span class="identifier">size_</span> <span class="special">=</span> <span class="identifier">sz</span><span class="special">;</span> 1825 <span class="special">}</span> 1826 1827 <span class="keyword">alignas</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="keyword">unsigned</span> <span class="keyword">char</span> <span class="identifier">buf_</span><span class="special">[</span><span class="identifier">N</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)];</span> 1828 <span class="identifier">size_type</span> <span class="identifier">size_</span><span class="special">;</span> 1829<span class="special">};</span> 1830</pre> 1831<p> 1832 </p> 1833<p> 1834 That's quite a bit of code. However, by using <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code>, 1835 we were able to write only 22 functions, and let <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1836 provide the other 39. 9 of the 22 function that we did have to write were constructors 1837 and special member functions, and those always have to be written in the derived 1838 class; <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1839 never could have helped with those. 1840 </p> 1841<div class="note"><table border="0" summary="Note"> 1842<tr> 1843<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 1844<th align="left">Note</th> 1845</tr> 1846<tr><td align="left" valign="top"><p> 1847 <code class="computeroutput"><a class="link" href="../boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 1848 does not support all the sets of container requirements in the standard. 1849 In particular, it does not support the allocator-aware requirements, and 1850 it does not support the associative or unordered associative container requirements. 1851 </p></td></tr> 1852</table></div> 1853</div> 1854<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 1855<td align="left"></td> 1856<td align="right"><div class="copyright-footer">Copyright © 2019 T. Zachary Laine<p> 1857 Distributed under the Boost Software License, Version 1.0. (See accompanying 1858 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>) 1859 </p> 1860</div></td> 1861</tr></table> 1862<hr> 1863<div class="spirit-nav"> 1864<a accesskey="p" href="tutorial___view_interface_.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stl_interfaces.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="tutorial___reverse_iterator_.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 1865</div> 1866</body> 1867</html> 1868