| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>Array Example Boostbook XML Documentation</title>
- <link rel="stylesheet" href="../../../../doc/html/boostbook.css" type="text/css">
- <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot_8125">
- <link rel="home" href="../index.html" title="Document To Test Formatting">
- <link rel="up" href="../index.html" title="Document To Test Formatting">
- <link rel="prev" href="remez.html" title="Sample Article (The Remez Method)">
- <link rel="next" href="../boost/array.html" title="Class template array">
- </head>
- <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
- <table cellpadding="2" width="100%"><tr>
- <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
- <td align="center"><a href="../../../../index.html">Home</a></td>
- <td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
- <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
- <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
- <td align="center"><a href="../../../../more/index.htm">More</a></td>
- </tr></table>
- <hr>
- <div class="spirit-nav">
- <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>
- </div>
- <div class="section" lang="en">
- <div class="titlepage"><div><div><h2 class="title" style="clear: both">
- <a name="document_to_test_formatting.array"></a><a class="link" href="array.html" title="Array Example Boostbook XML Documentation"> Array Example Boostbook
- XML Documentation</a>
- </h2></div></div></div>
- <div class="toc"><dl>
- <dt><span class="section"><a href="array.html#array.intro">Introduction</a></span></dt>
- <dt><span class="section"><a href="array.html#id540764">Reference</a></span></dt>
- <dt><span class="section"><a href="array.html#array.rationale">Design Rationale</a></span></dt>
- <dt><span class="section"><a href="array.html#array.more.info">For more information...</a></span></dt>
- <dt><span class="section"><a href="array.html#array.ack">Acknowledgements</a></span></dt>
- </dl></div>
- <div class="section" lang="en">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="array.intro"></a>Introduction</h3></div></div></div>
- <p>The C++ Standard Template Library STL as part of the C++
- Standard Library provides a framework for processing algorithms on
- different kind of containers. However, ordinary arrays don't
- provide the interface of STL containers (although, they provide
- the iterator interface of STL containers).</p>
- <p>As replacement for ordinary arrays, the STL provides class
- <code class="computeroutput">std::vector</code>. However,
- <code class="computeroutput">std::vector<></code> provides
- the semantics of dynamic arrays. Thus, it manages data to be able
- to change the number of elements. This results in some overhead in
- case only arrays with static size are needed.</p>
- <p>In his book, <span class="emphasis"><em>Generic Programming and the
- STL</em></span>, Matthew H. Austern introduces a useful wrapper
- class for ordinary arrays with static size, called
- <code class="computeroutput">block</code>. It is safer and has no worse performance than
- ordinary arrays. In <span class="emphasis"><em>The C++ Programming
- Language</em></span>, 3rd edition, Bjarne Stroustrup introduces a
- similar class, called <code class="computeroutput">c_array</code>, which I (<a href="http://www.josuttis.com" target="_top">Nicolai Josuttis</a>) present
- slightly modified in my book <span class="emphasis"><em>The C++ Standard Library -
- A Tutorial and Reference</em></span>, called
- <code class="computeroutput">carray</code>. This is the essence of these approaches
- spiced with many feedback from <a href="http://www.boost.org" target="_top">boost</a>.</p>
- <p>After considering different names, we decided to name this
- class simply <code class="computeroutput"><a class="link" href="../boost/array.html" title="Class template array">array</a></code>.</p>
- <p>Note that this class is suggested to be part of the next
- Technical Report, which will extend the C++ Standard (see
- <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>
- <p>Class <code class="computeroutput"><a class="link" href="../boost/array.html" title="Class template array">array</a></code> fulfills most
- but not all of the requirements of "reversible containers" (see
- Section 23.1, [lib.container.requirements] of the C++
- Standard). The reasons array is not an reversible STL container is
- because:
- </p>
- <div class="itemizedlist"><ul type="disc" compact>
- <li>No constructors are provided.</li>
- <li>Elements may have an undetermined initial value (see <a class="xref" href="array.html#array.rationale" title="Design Rationale">the section called “Design Rationale”</a>).</li>
- <li>
- <code class="computeroutput"><a class="link" href="../boost/array.html#boost.swap">swap</a></code>() has no constant complexity.</li>
- <li>
- <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>
- <li>The container provides no allocator support.</li>
- </ul></div>
- <p>
- </p>
- <p>It doesn't fulfill the requirements of a "sequence" (see Section 23.1.1, [lib.sequence.reqmts] of the C++ Standard), except that:
- </p>
- <div class="itemizedlist"><ul type="disc" compact>
- <li>
- <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>
- <li>
- <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>
- </ul></div>
- <p>
- </p>
- </div>
- <div class="section" lang="en">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="id540764"></a>Reference</h3></div></div></div>
- <div class="toc"><dl><dt><span class="section"><a href="array.html#header.boost.array_hpp">Header <boost/array.hpp></a></span></dt></dl></div>
- <div class="section" lang="en">
- <div class="titlepage"><div><div><h4 class="title">
- <a name="header.boost.array_hpp"></a>Header <<a href="../../../../boost/array.hpp" target="_top">boost/array.hpp</a>></h4></div></div></div>
- <pre class="synopsis"><span class="bold"><strong>namespace</strong></span> boost {
- <span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> T, std::size_t N> <span class="bold"><strong>class</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a>;
- <span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> T, std::size_t N>
- <span class="type"><span class="bold"><strong>void</strong></span></span> <a class="link" href="../boost/array.html#boost.swap">swap</a>(
- <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- ,
-
- <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- );
- <span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> T, std::size_t N>
- <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>(
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- ,
-
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- );
- <span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> T, std::size_t N>
- <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>(
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- ,
-
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- );
- <span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> T, std::size_t N>
- <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><</a>(
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- ,
-
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- );
- <span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> T, std::size_t N>
- <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>></a>(
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- ,
-
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- );
- <span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> T, std::size_t N>
- <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><=</a>(
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- ,
-
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- );
- <span class="bold"><strong>template</strong></span><<span class="bold"><strong>typename</strong></span> T, std::size_t N>
- <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>>=</a>(
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- ,
-
- <span class="bold"><strong>const</strong></span> <a class="link" href="../boost/array.html" title="Class template array">array</a><T, N>&
- );
- }</pre>
- </div>
- </div>
- <div class="section" lang="en">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="array.rationale"></a>Design Rationale</h3></div></div></div>
- <p>
- There was an important design tradeoff regarding the
- constructors: We could implement array as an "aggregate" (see
- Section 8.5.1, [dcl.init.aggr], of the C++ Standard). This would
- mean:
- </p>
- <div class="itemizedlist"><ul type="disc"><li>
- <p>
- An array can be initialized with a
- brace-enclosing, comma-separated list of initializers for the
- elements of the container, written in increasing subscript
- order:
- </p>
- <pre class="programlisting">
- <code class="computeroutput"><a class="link" href="../boost/array.html" title="Class template array">boost::array</a></code><int,4> a = { { 1, 2, 3 } };
- </pre>
- <p>
- Note that if there are fewer elements in the
- initializer list, then each remaining element gets
- default-initialized (thus, it has a defined value).
- </p>
- </li></ul></div>
- <p>
- </p>
- <p>
- However, this approach has its drawbacks: <span class="bold"><strong>
- passing no initializer list means that the elements
- have an indetermined initial value
- </strong></span>, because the rule says
- that aggregates may have:
- </p>
- <div class="itemizedlist"><ul type="disc">
- <li>No user-declared constructors.</li>
- <li>No private or protected non-static data members.</li>
- <li>No base classes.</li>
- <li>No virtual functions.</li>
- </ul></div>
- <p>
- </p>
- <p>Nevertheless, The current implementation uses this approach.</p>
- <p>
- Note that for standard conforming compilers it is possible to
- use fewer braces (according to 8.5.1 (11) of the Standard). That is,
- you can initialize an array as follows:
- </p>
- <pre class="programlisting">
- <code class="computeroutput"><a class="link" href="../boost/array.html" title="Class template array">boost::array</a></code><int,4> a = { 1, 2, 3 };
- </pre>
- <p>
- I'd appreciate any constructive feedback. <span class="bold"><strong>
- Please note: I don't have time to read all boost
- mails. Thus, to make sure that feedback arrives to me, please send
- me a copy of each mail regarding this class.
- </strong></span>
- </p>
- <p>
- The code is provided "as is" without expressed or implied
- warranty.
- </p>
- </div>
- <div class="section" lang="en">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="array.more.info"></a>For more information...</h3></div></div></div>
- <p>
- To find more details about using ordinary arrays in C++ and
- the framework of the STL, see e.g.
- </p>
- <div class="literallayout"><p><br>
- The C++ Standard Library - A Tutorial and Reference<br>
- by Nicolai M. Josuttis<br>
- Addison Wesley Longman, 1999<br>
- ISBN 0-201-37926-0<br>
- </p></div>
- <p>
- </p>
- <p>
- <a href="http://www.josuttis.com/" target="_top">
- Home Page of Nicolai
- Josuttis
- </a>
- </p>
- </div>
- <div class="section" lang="en">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="array.ack"></a>Acknowledgements</h3></div></div></div>
- <p>Doug Gregor ported the documentation to the BoostBook format.</p>
- </div>
- </div>
- <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
- <td align="left"></td>
- <td align="right"><div class="copyright-footer">Copyright © 2007 John Maddock, Joel de Guzman, Eric Niebler and Matias
- Capeletto<p>
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- 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>)
- </p>
- </div></td>
- </tr></table>
- <hr>
- <div class="spirit-nav">
- <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>
- </div>
- </body>
- </html>
|