array.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  4. <title>Array Example Boostbook XML Documentation</title>
  5. <link rel="stylesheet" href="../../../../doc/html/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot_8125">
  7. <link rel="home" href="../index.html" title="Document To Test Formatting">
  8. <link rel="up" href="../index.html" title="Document To Test Formatting">
  9. <link rel="prev" href="remez.html" title="Sample Article (The Remez Method)">
  10. <link rel="next" href="../boost/array.html" title="Class template array">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="remez.html"><img src="../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../boost/array.html"><img src="../../../../doc/html/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section" lang="en">
  26. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  27. <a name="document_to_test_formatting.array"></a><a class="link" href="array.html" title="Array Example Boostbook XML Documentation"> Array Example Boostbook
  28. XML Documentation</a>
  29. </h2></div></div></div>
  30. <div class="toc"><dl>
  31. <dt><span class="section"><a href="array.html#array.intro">Introduction</a></span></dt>
  32. <dt><span class="section"><a href="array.html#id540764">Reference</a></span></dt>
  33. <dt><span class="section"><a href="array.html#array.rationale">Design Rationale</a></span></dt>
  34. <dt><span class="section"><a href="array.html#array.more.info">For more information...</a></span></dt>
  35. <dt><span class="section"><a href="array.html#array.ack">Acknowledgements</a></span></dt>
  36. </dl></div>
  37. <div class="section" lang="en">
  38. <div class="titlepage"><div><div><h3 class="title">
  39. <a name="array.intro"></a>Introduction</h3></div></div></div>
  40. <p>The C++ Standard Template Library STL as part of the C++
  41. Standard Library provides a framework for processing algorithms on
  42. different kind of containers. However, ordinary arrays don't
  43. provide the interface of STL containers (although, they provide
  44. the iterator interface of STL containers).</p>
  45. <p>As replacement for ordinary arrays, the STL provides class
  46. <code class="computeroutput">std::vector</code>. However,
  47. <code class="computeroutput">std::vector&lt;&gt;</code> provides
  48. the semantics of dynamic arrays. Thus, it manages data to be able
  49. to change the number of elements. This results in some overhead in
  50. case only arrays with static size are needed.</p>
  51. <p>In his book, <span class="emphasis"><em>Generic Programming and the
  52. STL</em></span>, Matthew H. Austern introduces a useful wrapper
  53. class for ordinary arrays with static size, called
  54. <code class="computeroutput">block</code>. It is safer and has no worse performance than
  55. ordinary arrays. In <span class="emphasis"><em>The C++ Programming
  56. Language</em></span>, 3rd edition, Bjarne Stroustrup introduces a
  57. similar class, called <code class="computeroutput">c_array</code>, which I (<a href="http://www.josuttis.com" target="_top">Nicolai Josuttis</a>) present
  58. slightly modified in my book <span class="emphasis"><em>The C++ Standard Library -
  59. A Tutorial and Reference</em></span>, called
  60. <code class="computeroutput">carray</code>. This is the essence of these approaches
  61. spiced with many feedback from <a href="http://www.boost.org" target="_top">boost</a>.</p>
  62. <p>After considering different names, we decided to name this
  63. class simply <code class="computeroutput"><a class="link" href="../boost/array.html" title="Class template array">array</a></code>.</p>
  64. <p>Note that this class is suggested to be part of the next
  65. Technical Report, which will extend the C++ Standard (see
  66. <a href="http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1548.htm" target="_top">http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1548.htm</a>).</p>
  67. <p>Class <code class="computeroutput"><a class="link" href="../boost/array.html" title="Class template array">array</a></code> fulfills most
  68. but not all of the requirements of "reversible containers" (see
  69. Section 23.1, [lib.container.requirements] of the C++
  70. Standard). The reasons array is not an reversible STL container is
  71. because:
  72. </p>
  73. <div class="itemizedlist"><ul type="disc" compact>
  74. <li>No constructors are provided.</li>
  75. <li>Elements may have an undetermined initial value (see <a class="xref" href="array.html#array.rationale" title="Design Rationale">the section called &#8220;Design Rationale&#8221;</a>).</li>
  76. <li>
  77. <code class="computeroutput"><a class="link" href="../boost/array.html#boost.swap">swap</a></code>() has no constant complexity.</li>
  78. <li>
  79. <code class="computeroutput"><a class="link" href="../boost/array.html#id185107-bb">size</a></code>() is always constant, based on the second template argument of the type.</li>
  80. <li>The container provides no allocator support.</li>
  81. </ul></div>
  82. <p>
  83. </p>
  84. <p>It doesn't fulfill the requirements of a "sequence" (see Section 23.1.1, [lib.sequence.reqmts] of the C++ Standard), except that:
  85. </p>
  86. <div class="itemizedlist"><ul type="disc" compact>
  87. <li>
  88. <code class="computeroutput"><a class="link" href="../boost/array.html#id155276-bb">front</a></code>() and <code class="computeroutput"><a class="link" href="../boost/array.html#id155324-bb">back</a></code>() are provided.</li>
  89. <li>
  90. <code class="computeroutput"><a class="link" href="../boost/array.html#id155129-bb">operator[]</a></code> and <code class="computeroutput"><a class="link" href="../boost/array.html#id155202-bb">at</a></code>() are provided.</li>
  91. </ul></div>
  92. <p>
  93. </p>
  94. </div>
  95. <div class="section" lang="en">
  96. <div class="titlepage"><div><div><h3 class="title">
  97. <a name="id540764"></a>Reference</h3></div></div></div>
  98. <div class="toc"><dl><dt><span class="section"><a href="array.html#header.boost.array_hpp">Header &lt;boost/array.hpp&gt;</a></span></dt></dl></div>
  99. <div class="section" lang="en">
  100. <div class="titlepage"><div><div><h4 class="title">
  101. <a name="header.boost.array_hpp"></a>Header &lt;<a href="../../../../boost/array.hpp" target="_top">boost/array.hpp</a>&gt;</h4></div></div></div>
  102. <pre class="synopsis"><span class="bold"><strong>namespace</strong></span> boost {
  103. <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> T, std::size_t N&gt; <span class="bold"><strong>class</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>;
  104. <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> T, std::size_t N&gt;
  105. <span class="type"><span class="bold"><strong>void</strong></span></span> <a class="link" href="../boost/array.html#boost.swap">swap</a>(
  106. <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  107. ,
  108. <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  109. );
  110. <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> T, std::size_t N&gt;
  111. <span class="type"><span class="bold"><strong>bool</strong></span></span> <a class="link" href="../boost/array.html#boost.operator=="><span class="bold"><strong>operator</strong></span>==</a>(
  112. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  113. ,
  114. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  115. );
  116. <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> T, std::size_t N&gt;
  117. <span class="type"><span class="bold"><strong>bool</strong></span></span> <a class="link" href="../boost/array.html#boost.operator!="><span class="bold"><strong>operator</strong></span>!=</a>(
  118. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  119. ,
  120. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  121. );
  122. <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> T, std::size_t N&gt;
  123. <span class="type"><span class="bold"><strong>bool</strong></span></span> <a class="link" href="../boost/array.html#boost.operator_id227596"><span class="bold"><strong>operator</strong></span>&lt;</a>(
  124. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  125. ,
  126. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  127. );
  128. <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> T, std::size_t N&gt;
  129. <span class="type"><span class="bold"><strong>bool</strong></span></span> <a class="link" href="../boost/array.html#boost.operator_id227679"><span class="bold"><strong>operator</strong></span>&gt;</a>(
  130. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  131. ,
  132. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  133. );
  134. <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> T, std::size_t N&gt;
  135. <span class="type"><span class="bold"><strong>bool</strong></span></span> <a class="link" href="../boost/array.html#boost.operator_=_id227747"><span class="bold"><strong>operator</strong></span>&lt;=</a>(
  136. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  137. ,
  138. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  139. );
  140. <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> T, std::size_t N&gt;
  141. <span class="type"><span class="bold"><strong>bool</strong></span></span> <a class="link" href="../boost/array.html#boost.operator_=_id227814"><span class="bold"><strong>operator</strong></span>&gt;=</a>(
  142. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  143. ,
  144. <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>&lt;T, N&gt;&amp;
  145. );
  146. }</pre>
  147. </div>
  148. </div>
  149. <div class="section" lang="en">
  150. <div class="titlepage"><div><div><h3 class="title">
  151. <a name="array.rationale"></a>Design Rationale</h3></div></div></div>
  152. <p>
  153. There was an important design tradeoff regarding the
  154. constructors: We could implement array as an "aggregate" (see
  155. Section 8.5.1, [dcl.init.aggr], of the C++ Standard). This would
  156. mean:
  157. </p>
  158. <div class="itemizedlist"><ul type="disc"><li>
  159. <p>
  160. An array can be initialized with a
  161. brace-enclosing, comma-separated list of initializers for the
  162. elements of the container, written in increasing subscript
  163. order:
  164. </p>
  165. <pre class="programlisting">
  166. <code class="computeroutput"><a class="link" href="../boost/array.html" title="Class template array">boost::array</a></code>&lt;int,4&gt; a = { { 1, 2, 3 } };
  167. </pre>
  168. <p>
  169. Note that if there are fewer elements in the
  170. initializer list, then each remaining element gets
  171. default-initialized (thus, it has a defined value).
  172. </p>
  173. </li></ul></div>
  174. <p>
  175. </p>
  176. <p>
  177. However, this approach has its drawbacks: <span class="bold"><strong>
  178. passing no initializer list means that the elements
  179. have an indetermined initial value
  180. </strong></span>, because the rule says
  181. that aggregates may have:
  182. </p>
  183. <div class="itemizedlist"><ul type="disc">
  184. <li>No user-declared constructors.</li>
  185. <li>No private or protected non-static data members.</li>
  186. <li>No base classes.</li>
  187. <li>No virtual functions.</li>
  188. </ul></div>
  189. <p>
  190. </p>
  191. <p>Nevertheless, The current implementation uses this approach.</p>
  192. <p>
  193. Note that for standard conforming compilers it is possible to
  194. use fewer braces (according to 8.5.1 (11) of the Standard). That is,
  195. you can initialize an array as follows:
  196. </p>
  197. <pre class="programlisting">
  198. <code class="computeroutput"><a class="link" href="../boost/array.html" title="Class template array">boost::array</a></code>&lt;int,4&gt; a = { 1, 2, 3 };
  199. </pre>
  200. <p>
  201. I'd appreciate any constructive feedback. <span class="bold"><strong>
  202. Please note: I don't have time to read all boost
  203. mails. Thus, to make sure that feedback arrives to me, please send
  204. me a copy of each mail regarding this class.
  205. </strong></span>
  206. </p>
  207. <p>
  208. The code is provided "as is" without expressed or implied
  209. warranty.
  210. </p>
  211. </div>
  212. <div class="section" lang="en">
  213. <div class="titlepage"><div><div><h3 class="title">
  214. <a name="array.more.info"></a>For more information...</h3></div></div></div>
  215. <p>
  216. To find more details about using ordinary arrays in C++ and
  217. the framework of the STL, see e.g.
  218. </p>
  219. <div class="literallayout"><p><br>
  220.          The C++ Standard Library - A Tutorial and Reference<br>
  221.          by Nicolai M. Josuttis<br>
  222.          Addison Wesley Longman, 1999<br>
  223.          ISBN 0-201-37926-0<br>
  224.       </p></div>
  225. <p>
  226. </p>
  227. <p>
  228. <a href="http://www.josuttis.com/" target="_top">
  229. Home Page of Nicolai
  230. Josuttis
  231. </a>
  232. </p>
  233. </div>
  234. <div class="section" lang="en">
  235. <div class="titlepage"><div><div><h3 class="title">
  236. <a name="array.ack"></a>Acknowledgements</h3></div></div></div>
  237. <p>Doug Gregor ported the documentation to the BoostBook format.</p>
  238. </div>
  239. </div>
  240. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  241. <td align="left"></td>
  242. <td align="right"><div class="copyright-footer">Copyright © 2007 John Maddock, Joel de Guzman, Eric Niebler and Matias
  243. Capeletto<p>
  244. Distributed under the Boost Software License, Version 1.0. (See accompanying
  245. 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>)
  246. </p>
  247. </div></td>
  248. </tr></table>
  249. <hr>
  250. <div class="spirit-nav">
  251. <a accesskey="p" href="remez.html"><img src="../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../boost/array.html"><img src="../../../../doc/html/images/next.png" alt="Next"></a>
  252. </div>
  253. </body>
  254. </html>
粤ICP备19079148号