• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Getting started</title>
5<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../index.html" title="Chapter 1. Boost.Histogram">
8<link rel="up" href="../index.html" title="Chapter 1. Boost.Histogram">
9<link rel="prev" href="overview.html" title="Overview">
10<link rel="next" href="guide.html" title="User guide">
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="../../../../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="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="guide.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h2 class="title" style="clear: both">
27<a name="histogram.getting_started"></a><a class="link" href="getting_started.html" title="Getting started">Getting started</a>
28</h2></div></div></div>
29<div class="toc"><dl class="toc">
30<dt><span class="section"><a href="getting_started.html#histogram.getting_started.1d_histogram_with_axis_types_kno">1d-histogram
31      with axis types known at compile-time</a></span></dt>
32<dt><span class="section"><a href="getting_started.html#histogram.getting_started.3d_histogram_axis_configuration_">3d-histogram
33      (axis configuration defined at run-time)</a></span></dt>
34<dt><span class="section"><a href="getting_started.html#histogram.getting_started.1d_profile">1d-profile</a></span></dt>
35<dt><span class="section"><a href="getting_started.html#histogram.getting_started.standard_library_algorithms">Standard
36      library algorithms</a></span></dt>
37<dt><span class="section"><a href="getting_started.html#histogram.getting_started.making_classes_that_hold_histogr">Making
38      classes that hold histograms</a></span></dt>
39</dl></div>
40<p>
41      Here are some commented examples to copy-paste from, this should allow you
42      to kick off a project with Boost.Histogram. If you prefer a traditional structured
43      exposition, go to the <a class="link" href="guide.html" title="User guide">user guide</a>.
44    </p>
45<p>
46      Boost.Histogram uses <span class="emphasis"><em>axis</em></span> objects to convert input values
47      into indices. The library comes with several builtin axis types, which can
48      be configured via template parameters. This already gives you a lot of flexibility
49      should you need it, otherwise just use the defaults. Beyond that, you can easily
50      write your own axis type.
51    </p>
52<div class="section">
53<div class="titlepage"><div><div><h3 class="title">
54<a name="histogram.getting_started.1d_histogram_with_axis_types_kno"></a><a class="link" href="getting_started.html#histogram.getting_started.1d_histogram_with_axis_types_kno" title="1d-histogram with axis types known at compile-time">1d-histogram
55      with axis types known at compile-time</a>
56</h3></div></div></div>
57<p>
58        When the axis types for the histogram are known at compile-time, the library
59        generates the fastest and most efficient code for you. Here is such an example.
60      </p>
61<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">algorithm</span><span class="special">&gt;</span>           <span class="comment">// std::for_each</span>
62<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>    <span class="comment">// only needed for printing</span>
63<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span> <span class="comment">// make_histogram, regular, weight, indexed</span>
64<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>             <span class="comment">// assert (used to test this example for correctness)</span>
65<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">functional</span><span class="special">&gt;</span>          <span class="comment">// std::ref</span>
66<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>            <span class="comment">// std::cout, std::flush</span>
67<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">sstream</span><span class="special">&gt;</span>             <span class="comment">// std::ostringstream</span>
68
69<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
70  <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span> <span class="comment">// strip the boost::histogram prefix</span>
71
72  <span class="comment">/*
73    Create a 1d-histogram with a regular axis that has 6 equidistant bins on
74    the real line from -1.0 to 2.0, and label it as "x". A family of overloaded
75    factory functions called `make_histogram` makes creating histograms easy.
76
77    A regular axis is a sequence of semi-open bins. Extra under- and overflow
78    bins extend the axis by default (this can be turned off).
79
80    index    :      -1  |  0  |  1  |  2  |  3  |  4  |  5  |  6
81    bin edges:  -inf  -1.0  -0.5   0.0   0.5   1.0   1.5   2.0   inf
82  */</span>
83  <span class="keyword">auto</span> <span class="identifier">h</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;(</span><span class="number">6</span><span class="special">,</span> <span class="special">-</span><span class="number">1.0</span><span class="special">,</span> <span class="number">2.0</span><span class="special">,</span> <span class="string">"x"</span><span class="special">));</span>
84
85  <span class="comment">/*
86    Let's fill a histogram with data, typically this happens in a loop.
87
88    STL algorithms are supported. std::for_each is very convenient to fill a
89    histogram from an iterator range. Use std::ref in the call, if you don't
90    want std::for_each to make a copy of your histogram.
91  */</span>
92  <span class="keyword">auto</span> <span class="identifier">data</span> <span class="special">=</span> <span class="special">{-</span><span class="number">0.5</span><span class="special">,</span> <span class="number">1.1</span><span class="special">,</span> <span class="number">0.3</span><span class="special">,</span> <span class="number">1.7</span><span class="special">};</span>
93  <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">data</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">ref</span><span class="special">(</span><span class="identifier">h</span><span class="special">));</span>
94  <span class="comment">// let's fill some more values manually</span>
95  <span class="identifier">h</span><span class="special">(-</span><span class="number">1.5</span><span class="special">);</span> <span class="comment">// is placed in underflow bin -1</span>
96  <span class="identifier">h</span><span class="special">(-</span><span class="number">1.0</span><span class="special">);</span> <span class="comment">// is placed in bin 0, bin interval is semi-open</span>
97  <span class="identifier">h</span><span class="special">(</span><span class="number">2.0</span><span class="special">);</span>  <span class="comment">// is placed in overflow bin 6, bin interval is semi-open</span>
98  <span class="identifier">h</span><span class="special">(</span><span class="number">20.0</span><span class="special">);</span> <span class="comment">// is placed in overflow bin 6</span>
99
100  <span class="comment">/*
101    This does a weighted fill using the `weight` function as an additional
102    argument. It may appear at the beginning or end of the argument list. C++
103    doesn't have keyword arguments like Python, this is the next-best thing.
104  */</span>
105  <span class="identifier">h</span><span class="special">(</span><span class="number">0.1</span><span class="special">,</span> <span class="identifier">weight</span><span class="special">(</span><span class="number">1.0</span><span class="special">));</span>
106
107  <span class="comment">/*
108    Iterate over bins with the `indexed` range generator, which provides a
109    special accessor object, that can be used to obtain the current bin index,
110    and the current bin value by dereferncing (it acts like a pointer to the
111    value). Using `indexed` is convenient and gives you better performance than
112    looping over the histogram cells with hand-written for loops. By default,
113    under- and overflow bins are skipped. Passing `coverage::all` as the
114    optional second argument iterates over all bins.
115
116    - Access the value with the dereference operator.
117    - Access the current index with `index(d)` method of the accessor.
118    - Access the corresponding bin interval view with `bin(d)`.
119
120    The return type of `bin(d)` depends on the axis type (see the axis reference
121    for details). It usually is a class that represents a semi-open interval.
122    Edges can be accessed with methods `lower()` and `upper()`.
123  */</span>
124
125  <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostringstream</span> <span class="identifier">os</span><span class="special">;</span>
126  <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span><span class="special">&amp;&amp;</span> <span class="identifier">x</span> <span class="special">:</span> <span class="identifier">indexed</span><span class="special">(</span><span class="identifier">h</span><span class="special">,</span> <span class="identifier">coverage</span><span class="special">::</span><span class="identifier">all</span><span class="special">))</span> <span class="special">{</span>
127    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">format</span><span class="special">(</span><span class="string">"bin %2i [%4.1f, %4.1f): %i\n"</span><span class="special">)</span>
128          <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">().</span><span class="identifier">lower</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">().</span><span class="identifier">upper</span><span class="special">()</span> <span class="special">%</span> <span class="special">*</span><span class="identifier">x</span><span class="special">;</span>
129  <span class="special">}</span>
130
131  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">flush</span><span class="special">;</span>
132
133  <span class="identifier">assert</span><span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">==</span> <span class="string">"bin -1 [-inf, -1.0): 1\n"</span>
134                     <span class="string">"bin  0 [-1.0, -0.5): 1\n"</span>
135                     <span class="string">"bin  1 [-0.5, -0.0): 1\n"</span>
136                     <span class="string">"bin  2 [-0.0,  0.5): 2\n"</span>
137                     <span class="string">"bin  3 [ 0.5,  1.0): 0\n"</span>
138                     <span class="string">"bin  4 [ 1.0,  1.5): 1\n"</span>
139                     <span class="string">"bin  5 [ 1.5,  2.0): 1\n"</span>
140                     <span class="string">"bin  6 [ 2.0,  inf): 2\n"</span><span class="special">);</span>
141<span class="special">}</span>
142</pre>
143<p>
144        We passed the <code class="computeroutput"><a class="link" href="../boost/histogram/axis/regular.html" title="Class template regular">regular</a></code>
145        axis type directly to the <code class="computeroutput"><a class="link" href="reference.html#header.boost.histogram.make_histogram_hpp" title="Header &lt;boost/histogram/make_histogram.hpp&gt;">make_histogram</a></code>
146        function. The library then generates a specialized histogram type with just
147        one regular axis from a generic template.
148      </p>
149<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
150<li class="listitem">
151            Pro: Many user errors are already caught at compile-time, not at run-time.
152          </li>
153<li class="listitem">
154            Con: You get template errors if you make a mistake, which may be hard
155            to read. We try to give you useful error messages, but still.
156          </li>
157</ul></div>
158</div>
159<div class="section">
160<div class="titlepage"><div><div><h3 class="title">
161<a name="histogram.getting_started.3d_histogram_axis_configuration_"></a><a class="link" href="getting_started.html#histogram.getting_started.3d_histogram_axis_configuration_" title="3d-histogram (axis configuration defined at run-time)">3d-histogram
162      (axis configuration defined at run-time)</a>
163</h3></div></div></div>
164<p>
165        Sometimes, you don't know the number or types of axes at compile-time, because
166        it depends on run-time information. Perhaps you want to write a command-line
167        tool that generates histograms from input data, or you use this library as
168        a back-end for a product with a GUI. This is possible as well, here is the
169        example.
170      </p>
171<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
172<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
173<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
174<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
175<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">sstream</span><span class="special">&gt;</span>
176<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
177
178<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
179  <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span>
180
181  <span class="comment">/*
182    Create a histogram which can be configured dynamically at run-time. The axis
183    configuration is first collected in a vector of axis::variant type, which
184    can hold different axis types (those in its template argument list). Here,
185    we use a variant that can store a regular and a category axis.
186  */</span>
187  <span class="keyword">using</span> <span class="identifier">reg</span> <span class="special">=</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;;</span>
188  <span class="keyword">using</span> <span class="identifier">cat</span> <span class="special">=</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">category</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;;</span>
189  <span class="keyword">using</span> <span class="identifier">variant</span> <span class="special">=</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">variant</span><span class="special">&lt;</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;,</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">category</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;&gt;;</span>
190  <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">variant</span><span class="special">&gt;</span> <span class="identifier">axes</span><span class="special">;</span>
191  <span class="identifier">axes</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">cat</span><span class="special">({</span><span class="string">"red"</span><span class="special">,</span> <span class="string">"blue"</span><span class="special">}));</span>
192  <span class="identifier">axes</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">reg</span><span class="special">(</span><span class="number">3</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">,</span> <span class="string">"x"</span><span class="special">));</span>
193  <span class="identifier">axes</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">reg</span><span class="special">(</span><span class="number">3</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">,</span> <span class="string">"y"</span><span class="special">));</span>
194  <span class="comment">// passing an iterator range also works here</span>
195  <span class="keyword">auto</span> <span class="identifier">h</span> <span class="special">=</span> <span class="identifier">make_histogram</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">axes</span><span class="special">));</span>
196
197  <span class="comment">// fill histogram with data, usually this happens in a loop</span>
198  <span class="identifier">h</span><span class="special">(</span><span class="string">"red"</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.2</span><span class="special">);</span>
199  <span class="identifier">h</span><span class="special">(</span><span class="string">"blue"</span><span class="special">,</span> <span class="number">0.7</span><span class="special">,</span> <span class="number">0.3</span><span class="special">);</span>
200  <span class="identifier">h</span><span class="special">(</span><span class="string">"red"</span><span class="special">,</span> <span class="number">0.3</span><span class="special">,</span> <span class="number">0.7</span><span class="special">);</span>
201  <span class="identifier">h</span><span class="special">(</span><span class="string">"red"</span><span class="special">,</span> <span class="number">0.7</span><span class="special">,</span> <span class="number">0.7</span><span class="special">);</span>
202
203  <span class="comment">/*
204    Print histogram by iterating over bins.
205    Since the [bin type] of the category axis cannot be converted into a double,
206    it cannot be handled by the polymorphic interface of axis::variant. We use
207    axis::get to "cast" the variant type to the actual category type.
208  */</span>
209
210  <span class="comment">// get reference to category axis, performs a run-time checked static cast</span>
211  <span class="keyword">const</span> <span class="keyword">auto</span><span class="special">&amp;</span> <span class="identifier">cat_axis</span> <span class="special">=</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="identifier">cat</span><span class="special">&gt;(</span><span class="identifier">h</span><span class="special">.</span><span class="identifier">axis</span><span class="special">(</span><span class="number">0</span><span class="special">));</span>
212  <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostringstream</span> <span class="identifier">os</span><span class="special">;</span>
213  <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span><span class="special">&amp;&amp;</span> <span class="identifier">x</span> <span class="special">:</span> <span class="identifier">indexed</span><span class="special">(</span><span class="identifier">h</span><span class="special">))</span> <span class="special">{</span>
214    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">format</span><span class="special">(</span><span class="string">"(%i, %i, %i) %4s [%3.1f, %3.1f) [%3.1f, %3.1f) %3.0f\n"</span><span class="special">)</span>
215          <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">(</span><span class="number">2</span><span class="special">)</span>
216          <span class="special">%</span> <span class="identifier">cat_axis</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">(</span><span class="number">0</span><span class="special">))</span>
217          <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="number">1</span><span class="special">).</span><span class="identifier">lower</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="number">1</span><span class="special">).</span><span class="identifier">upper</span><span class="special">()</span>
218          <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="number">2</span><span class="special">).</span><span class="identifier">lower</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="number">2</span><span class="special">).</span><span class="identifier">upper</span><span class="special">()</span>
219          <span class="special">%</span> <span class="special">*</span><span class="identifier">x</span><span class="special">;</span>
220  <span class="special">}</span>
221
222  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">flush</span><span class="special">;</span>
223  <span class="identifier">assert</span><span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">==</span> <span class="string">"(0, 0, 0)  red [0.0, 0.3) [0.0, 0.3)   1\n"</span>
224                     <span class="string">"(1, 0, 0) blue [0.0, 0.3) [0.0, 0.3)   0\n"</span>
225                     <span class="string">"(0, 1, 0)  red [0.3, 0.7) [0.0, 0.3)   0\n"</span>
226                     <span class="string">"(1, 1, 0) blue [0.3, 0.7) [0.0, 0.3)   0\n"</span>
227                     <span class="string">"(0, 2, 0)  red [0.7, 1.0) [0.0, 0.3)   0\n"</span>
228                     <span class="string">"(1, 2, 0) blue [0.7, 1.0) [0.0, 0.3)   1\n"</span>
229                     <span class="string">"(0, 0, 1)  red [0.0, 0.3) [0.3, 0.7)   0\n"</span>
230                     <span class="string">"(1, 0, 1) blue [0.0, 0.3) [0.3, 0.7)   0\n"</span>
231                     <span class="string">"(0, 1, 1)  red [0.3, 0.7) [0.3, 0.7)   0\n"</span>
232                     <span class="string">"(1, 1, 1) blue [0.3, 0.7) [0.3, 0.7)   0\n"</span>
233                     <span class="string">"(0, 2, 1)  red [0.7, 1.0) [0.3, 0.7)   0\n"</span>
234                     <span class="string">"(1, 2, 1) blue [0.7, 1.0) [0.3, 0.7)   0\n"</span>
235                     <span class="string">"(0, 0, 2)  red [0.0, 0.3) [0.7, 1.0)   1\n"</span>
236                     <span class="string">"(1, 0, 2) blue [0.0, 0.3) [0.7, 1.0)   0\n"</span>
237                     <span class="string">"(0, 1, 2)  red [0.3, 0.7) [0.7, 1.0)   0\n"</span>
238                     <span class="string">"(1, 1, 2) blue [0.3, 0.7) [0.7, 1.0)   0\n"</span>
239                     <span class="string">"(0, 2, 2)  red [0.7, 1.0) [0.7, 1.0)   1\n"</span>
240                     <span class="string">"(1, 2, 2) blue [0.7, 1.0) [0.7, 1.0)   0\n"</span><span class="special">);</span>
241<span class="special">}</span>
242</pre>
243<p>
244        The axis configuration is passed to <code class="computeroutput"><span class="identifier">make_histogram</span></code>
245        as a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">variant</span><span class="special">&lt;...&gt;&gt;</span></code>,
246        which can hold arbitrary sequences of axis types from a predefined set.
247      </p>
248<p>
249        Run-time configurable histograms are a slower than their compile-time brethren,
250        but still pretty fast.
251      </p>
252<div class="note"><table border="0" summary="Note">
253<tr>
254<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
255<th align="left">Note</th>
256</tr>
257<tr><td align="left" valign="top"><p>
258          If you know already at compile-time that you will only use one axis type,
259          <code class="computeroutput"><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;</span></code>
260          for example, but not how many per histogram, then you can also pass a
261          <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;&gt;</span></code>
262          to <code class="computeroutput"><span class="identifier">make_histogram</span></code>. You
263          get almost the same speed as in the very first case, where both the axis
264          configuration was fully known at compile-time.
265        </p></td></tr>
266</table></div>
267<div class="note"><table border="0" summary="Note">
268<tr>
269<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
270<th align="left">Note</th>
271</tr>
272<tr><td align="left" valign="top"><p>
273          If you care about maximum performance: In this example, <code class="computeroutput"><span class="identifier">axis</span><span class="special">::</span><span class="identifier">category</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span></code> is used with two string labels "red"
274          and "blue". It is faster to use an enum, <code class="computeroutput"><span class="keyword">enum</span>
275          <span class="special">{</span> <span class="identifier">red</span><span class="special">,</span> <span class="identifier">blue</span> <span class="special">};</span></code> and a <code class="computeroutput"><span class="identifier">axis</span><span class="special">::</span><span class="identifier">category</span><span class="special">&lt;&gt;</span></code> axis.
276        </p></td></tr>
277</table></div>
278</div>
279<div class="section">
280<div class="titlepage"><div><div><h3 class="title">
281<a name="histogram.getting_started.1d_profile"></a><a class="link" href="getting_started.html#histogram.getting_started.1d_profile" title="1d-profile">1d-profile</a>
282</h3></div></div></div>
283<p>
284        The library was designed to be very flexible and modular. The modularity
285        is used, for example, to also provide profiles. Profiles are generalized
286        histograms. A histogram counts how often an input falls into a particular
287        cell. A profile accepts pairs of input values and a sample value. The profile
288        computes the mean of the samples that end up in each cell. Have a look at
289        the example, which should clear up any confusion.
290      </p>
291<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
292<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
293<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
294<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
295<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">sstream</span><span class="special">&gt;</span>
296
297<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
298  <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span>
299
300  <span class="comment">/*
301    Create a profile. Profiles does not only count entries in each cell, but
302    also compute the mean of a sample value in each cell.
303  */</span>
304  <span class="keyword">auto</span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">make_profile</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;(</span><span class="number">5</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">));</span>
305
306  <span class="comment">/*
307    Fill profile with data, usually this happens in a loop. You pass the sample
308    with the `sample` helper function. The sample can be the first or last
309    argument.
310  */</span>
311  <span class="identifier">p</span><span class="special">(</span><span class="number">0.1</span><span class="special">,</span> <span class="identifier">sample</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
312  <span class="identifier">p</span><span class="special">(</span><span class="number">0.15</span><span class="special">,</span> <span class="identifier">sample</span><span class="special">(</span><span class="number">3</span><span class="special">));</span>
313  <span class="identifier">p</span><span class="special">(</span><span class="number">0.2</span><span class="special">,</span> <span class="identifier">sample</span><span class="special">(</span><span class="number">4</span><span class="special">));</span>
314  <span class="identifier">p</span><span class="special">(</span><span class="number">0.9</span><span class="special">,</span> <span class="identifier">sample</span><span class="special">(</span><span class="number">5</span><span class="special">));</span>
315
316  <span class="comment">/*
317    Iterate over bins and print profile.
318  */</span>
319  <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostringstream</span> <span class="identifier">os</span><span class="special">;</span>
320  <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span><span class="special">&amp;&amp;</span> <span class="identifier">x</span> <span class="special">:</span> <span class="identifier">indexed</span><span class="special">(</span><span class="identifier">p</span><span class="special">))</span> <span class="special">{</span>
321    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">format</span><span class="special">(</span><span class="string">"bin %i [%3.1f, %3.1f) count %i mean %g\n"</span><span class="special">)</span>
322          <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">().</span><span class="identifier">lower</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">().</span><span class="identifier">upper</span><span class="special">()</span>
323          <span class="special">%</span> <span class="identifier">x</span><span class="special">-&gt;</span><span class="identifier">count</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">-&gt;</span><span class="identifier">value</span><span class="special">();</span>
324  <span class="special">}</span>
325
326  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">flush</span><span class="special">;</span>
327  <span class="identifier">assert</span><span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">==</span> <span class="string">"bin 0 [0.0, 0.2) count 2 mean 2\n"</span>
328                     <span class="string">"bin 1 [0.2, 0.4) count 1 mean 4\n"</span>
329                     <span class="string">"bin 2 [0.4, 0.6) count 0 mean 0\n"</span>
330                     <span class="string">"bin 3 [0.6, 0.8) count 0 mean 0\n"</span>
331                     <span class="string">"bin 4 [0.8, 1.0) count 1 mean 5\n"</span><span class="special">);</span>
332<span class="special">}</span>
333</pre>
334</div>
335<div class="section">
336<div class="titlepage"><div><div><h3 class="title">
337<a name="histogram.getting_started.standard_library_algorithms"></a><a class="link" href="getting_started.html#histogram.getting_started.standard_library_algorithms" title="Standard library algorithms">Standard
338      library algorithms</a>
339</h3></div></div></div>
340<p>
341        The library was designed to work well with the C++ standard library. Here
342        is an example on how to get the most common color from an image, using a
343        3d histogram and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">max_element</span></code>.
344      </p>
345<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">algorithm</span><span class="special">&gt;</span>           <span class="comment">// std::max_element</span>
346<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>    <span class="comment">// only needed for printing</span>
347<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span> <span class="comment">// make_histogram, integer, indexed</span>
348<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>            <span class="comment">// std::cout, std::endl</span>
349<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">sstream</span><span class="special">&gt;</span>             <span class="comment">// std::ostringstream</span>
350
351<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
352  <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span>
353  <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">literals</span><span class="special">;</span>
354
355  <span class="comment">/*
356    We make a 3d histogram for color values (r, g, b) in an image. We assume the values
357    are of type char. The value range then is [0, 256). The integer axis is perfect for
358    color values.
359  */</span>
360  <span class="keyword">auto</span> <span class="identifier">h</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span>
361    <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;(</span><span class="number">0</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="string">"r"</span><span class="special">),</span>
362    <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;(</span><span class="number">0</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="string">"g"</span><span class="special">),</span>
363    <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;(</span><span class="number">0</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="string">"b"</span><span class="special">)</span>
364  <span class="special">);</span>
365
366  <span class="comment">/*
367    We don't have real image data, so fill some fake data.
368  */</span>
369  <span class="identifier">h</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">);</span>
370  <span class="identifier">h</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">);</span>
371  <span class="identifier">h</span><span class="special">(</span><span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">0</span><span class="special">);</span>
372
373  <span class="comment">/*
374    Now let's say we want to know which color is most common. We can use std::max_element
375    on an indexed range for that.
376  */</span>
377  <span class="keyword">auto</span> <span class="identifier">ind</span> <span class="special">=</span> <span class="identifier">indexed</span><span class="special">(</span><span class="identifier">h</span><span class="special">);</span>
378  <span class="keyword">auto</span> <span class="identifier">max_it</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">max_element</span><span class="special">(</span><span class="identifier">ind</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">ind</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
379
380  <span class="comment">/*
381    max_it is a special iterator to the histogram cell with the highest count.
382    This iterator allows one to access the cell value, bin indices, and bin values.
383    You need to twice dereference it to get to the cell value.
384  */</span>
385  <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostringstream</span> <span class="identifier">os</span><span class="special">;</span>
386  <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">format</span><span class="special">(</span><span class="string">"count=%i rgb=(%i, %i, %i)"</span><span class="special">)</span>
387        <span class="special">%</span> <span class="special">**</span><span class="identifier">max_it</span> <span class="special">%</span> <span class="identifier">max_it</span><span class="special">-&gt;</span><span class="identifier">bin</span><span class="special">(</span><span class="number">0</span><span class="identifier">_c</span><span class="special">)</span> <span class="special">%</span> <span class="identifier">max_it</span><span class="special">-&gt;</span><span class="identifier">bin</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special">%</span> <span class="identifier">max_it</span><span class="special">-&gt;</span><span class="identifier">bin</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
388
389  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
390
391  <span class="identifier">assert</span><span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">==</span> <span class="string">"count=2 rgb=(1, 2, 3)"</span><span class="special">);</span>
392<span class="special">}</span>
393</pre>
394</div>
395<div class="section">
396<div class="titlepage"><div><div><h3 class="title">
397<a name="histogram.getting_started.making_classes_that_hold_histogr"></a><a class="link" href="getting_started.html#histogram.getting_started.making_classes_that_hold_histogr" title="Making classes that hold histograms">Making
398      classes that hold histograms</a>
399</h3></div></div></div>
400<p>
401        The histograms get their great flexibility and performance from being templated,
402        but this can make the types a bit cumbersome to write. Often it is possible
403        to use <code class="computeroutput"><span class="keyword">auto</span></code> to let the compiler
404        deduce the type, but when you want to store histograms in a class, you need
405        to write the type explicitly. The next example shows how this works.
406      </p>
407<pre class="programlisting"><span class="comment">//////////////// Begin: put this in header file ////////////////////</span>
408
409<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">algorithm</span><span class="special">&gt;</span>           <span class="comment">// std::max_element</span>
410<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>    <span class="comment">// only needed for printing</span>
411<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span> <span class="comment">// make_histogram, integer, indexed</span>
412<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>            <span class="comment">// std::cout, std::endl</span>
413<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">sstream</span><span class="special">&gt;</span>             <span class="comment">// std::ostringstream</span>
414<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">tuple</span><span class="special">&gt;</span>
415<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
416
417<span class="comment">// use this when axis configuration is fix to get highest performance</span>
418<span class="keyword">struct</span> <span class="identifier">HolderOfStaticHistogram</span> <span class="special">{</span>
419  <span class="comment">// put axis types here</span>
420  <span class="keyword">using</span> <span class="identifier">axes_t</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span>
421    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;,</span>
422    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;</span>
423  <span class="special">&gt;;</span>
424  <span class="keyword">using</span> <span class="identifier">hist_t</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">&lt;</span><span class="identifier">axes_t</span><span class="special">&gt;;</span>
425  <span class="identifier">hist_t</span> <span class="identifier">hist_</span><span class="special">;</span>
426<span class="special">};</span>
427
428<span class="comment">// use this when axis configuration should be flexible</span>
429<span class="keyword">struct</span> <span class="identifier">HolderOfDynamicHistogram</span> <span class="special">{</span>
430  <span class="comment">// put all axis types here that you are going to use</span>
431  <span class="keyword">using</span> <span class="identifier">axis_t</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">variant</span><span class="special">&lt;</span>
432    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;,</span>
433    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">variable</span><span class="special">&lt;&gt;,</span>
434    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;</span>
435  <span class="special">&gt;;</span>
436  <span class="keyword">using</span> <span class="identifier">axes_t</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">axis_t</span><span class="special">&gt;;</span>
437  <span class="keyword">using</span> <span class="identifier">hist_t</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">&lt;</span><span class="identifier">axes_t</span><span class="special">&gt;;</span>
438  <span class="identifier">hist_t</span> <span class="identifier">hist_</span><span class="special">;</span>
439<span class="special">};</span>
440
441<span class="comment">//////////////// End: put this in header file ////////////////////</span>
442
443<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
444  <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span>
445
446  <span class="identifier">HolderOfStaticHistogram</span> <span class="identifier">hs</span><span class="special">;</span>
447  <span class="identifier">hs</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;(</span><span class="number">5</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">),</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;(</span><span class="number">0</span><span class="special">,</span> <span class="number">3</span><span class="special">));</span>
448  <span class="comment">// now assign a different histogram</span>
449  <span class="identifier">hs</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;(</span><span class="number">3</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">),</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;(</span><span class="number">4</span><span class="special">,</span> <span class="number">6</span><span class="special">));</span>
450  <span class="comment">// hs.hist_ = make_histogram(axis::regular&lt;&gt;(5, 0, 1)); does not work;</span>
451  <span class="comment">// the static histogram cannot change the number or order of axis types</span>
452
453  <span class="identifier">HolderOfDynamicHistogram</span> <span class="identifier">hd</span><span class="special">;</span>
454  <span class="identifier">hd</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;(</span><span class="number">5</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">),</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;(</span><span class="number">0</span><span class="special">,</span> <span class="number">3</span><span class="special">));</span>
455  <span class="comment">// now assign a different histogram</span>
456  <span class="identifier">hd</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special">&lt;&gt;(</span><span class="number">3</span><span class="special">,</span> <span class="special">-</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">));</span>
457  <span class="comment">// and assign another</span>
458  <span class="identifier">hd</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;(</span><span class="number">0</span><span class="special">,</span> <span class="number">5</span><span class="special">),</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special">&lt;&gt;(</span><span class="number">3</span><span class="special">,</span> <span class="number">5</span><span class="special">));</span>
459<span class="special">}</span>
460</pre>
461</div>
462</div>
463<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
464<td align="left"></td>
465<td align="right"><div class="copyright-footer">Copyright © 2016-2019 Hans
466      Dembinski<p>
467        Distributed under the Boost Software License, Version 1.0. (See accompanying
468        file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
469      </p>
470</div></td>
471</tr></table>
472<hr>
473<div class="spirit-nav">
474<a accesskey="p" href="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="guide.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
475</div>
476</body>
477</html>
478