3 <meta http-equiv=
"Content-Type" content=
"text/html; charset=US-ASCII">
4 <title>Std copy
</title>
5 <link rel=
"stylesheet" href=
"../../../../../../doc/src/boostbook.css" type=
"text/css">
6 <meta name=
"generator" content=
"DocBook XSL Stylesheets V1.74.0">
7 <link rel=
"home" href=
"../../index.html" title=
"Chapter 1. Boost.Icl">
8 <link rel=
"up" href=
"../examples.html" title=
"Examples">
9 <link rel=
"prev" href=
"user_groups.html" title=
"User groups">
10 <link rel=
"next" href=
"std_transform.html" title=
"Std transform">
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>
22 <div class=
"spirit-nav">
23 <a accesskey=
"p" href=
"user_groups.html"><img src=
"../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../examples.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=
"std_transform.html"><img src=
"../../../../../../doc/src/images/next.png" alt=
"Next"></a>
25 <div class=
"section boost_icl_examples_std_copy" lang=
"en">
26 <div class=
"titlepage"><div><div><h3 class=
"title">
27 <a name=
"boost_icl.examples.std_copy"></a><a class=
"link" href=
"std_copy.html" title=
"Std copy">Std copy
</a>
28 </h3></div></div></div>
30 The standard algorithm
<a href=
"http://www.cplusplus.com/reference/algorithm/copy/" target=
"_top"><code class=
"computeroutput"><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">copy
</span></code></a>
31 can be used to fill interval containers from standard containers of intervals
32 or interval value pairs (segments). Because intervals do not represent
<span class=
"emphasis"><em><span class=
"bold"><strong>elements
</strong></span></em></span> but
<span class=
"emphasis"><em><span class=
"bold"><strong>sets
</strong></span></em></span>,
33 that can be empty or contain more than one element, the usage of
<code class=
"computeroutput"><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">copy
</span></code>
34 differs from what we are familiar with using
<span class=
"emphasis"><em>containers of elements
</em></span>.
36 <div class=
"itemizedlist"><ul type=
"disc">
38 Use
<code class=
"computeroutput"><span class=
"identifier">icl
</span><span class=
"special">::
</span><span class=
"identifier">inserter
</span></code> from
<code class=
"computeroutput"><span class=
"preprocessor">#include
</span>
39 <span class=
"special"><</span><span class=
"identifier">boost
</span><span class=
"special">/
</span><span class=
"identifier">icl
</span><span class=
"special">/
</span><span class=
"identifier">iterator
</span><span class=
"special">.
</span><span class=
"identifier">hpp
</span><span class=
"special">></span></code> instead of
<code class=
"computeroutput"><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">inserter
</span></code>
40 to call insertions on the target interval container.
43 As shown in the examples above and below this point, most of the time we
44 will not be interested to
<code class=
"computeroutput"><span class=
"identifier">insert
</span></code>
45 segments into
<code class=
"computeroutput"><a class=
"link" href=
"../../boost/icl/interval_map.html" title=
"Class template interval_map">interval_maps
</a></code>
46 but to
<a class=
"link" href=
"../function_reference/addition.html" title=
"Addition"><span class=
"emphasis"><em><span class=
"bold"><strong>add
</strong></span></em></span></a> them, in order to generate
47 the desired aggregation results. You can use
<code class=
"computeroutput"><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">copy
</span></code>
48 with an
<code class=
"computeroutput"><span class=
"identifier">icl
</span><span class=
"special">::
</span><span class=
"identifier">adder
</span></code> instead of an
<code class=
"computeroutput"><span class=
"identifier">icl
</span><span class=
"special">::
</span><span class=
"identifier">inserter
</span></code>
57 <pre class=
"programlisting"><span class=
"preprocessor">#include
</span> <span class=
"special"><</span><span class=
"identifier">iostream
</span><span class=
"special">></span>
58 <span class=
"preprocessor">#include
</span> <span class=
"special"><</span><span class=
"identifier">vector
</span><span class=
"special">></span>
59 <span class=
"preprocessor">#include
</span> <span class=
"special"><</span><span class=
"identifier">algorithm
</span><span class=
"special">></span>
60 <span class=
"preprocessor">#include
</span> <span class=
"special"><</span><span class=
"identifier">boost
</span><span class=
"special">/
</span><span class=
"identifier">icl
</span><span class=
"special">/
</span><span class=
"identifier">interval_map
</span><span class=
"special">.
</span><span class=
"identifier">hpp
</span><span class=
"special">></span>
62 <span class=
"keyword">using
</span> <span class=
"keyword">namespace
</span> <span class=
"identifier">std
</span><span class=
"special">;
</span>
63 <span class=
"keyword">using
</span> <span class=
"keyword">namespace
</span> <span class=
"identifier">boost
</span><span class=
"special">;
</span>
64 <span class=
"keyword">using
</span> <span class=
"keyword">namespace
</span> <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">icl
</span><span class=
"special">;
</span>
66 <span class=
"comment">// 'make_segments' returns a vector of interval value pairs, which
67 </span><span class=
"comment">// are not sorted. The values are taken from the minimal example
68 </span><span class=
"comment">// in section 'interval combining styles'.
69 </span><span class=
"identifier">vector
</span><span class=
"special"><</span><span class=
"identifier">pair
</span><span class=
"special"><</span><span class=
"identifier">discrete_interval
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">>,
</span> <span class=
"keyword">int
</span><span class=
"special">></span> <span class=
"special">></span> <span class=
"identifier">make_segments
</span><span class=
"special">()
</span>
70 <span class=
"special">{
</span>
71 <span class=
"identifier">vector
</span><span class=
"special"><</span><span class=
"identifier">pair
</span><span class=
"special"><</span><span class=
"identifier">discrete_interval
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">>,
</span> <span class=
"keyword">int
</span><span class=
"special">></span> <span class=
"special">></span> <span class=
"identifier">segment_vec
</span><span class=
"special">;
</span>
72 <span class=
"identifier">segment_vec
</span><span class=
"special">.
</span><span class=
"identifier">push_back
</span><span class=
"special">(
</span><span class=
"identifier">make_pair
</span><span class=
"special">(
</span><span class=
"identifier">discrete_interval
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">>::
</span><span class=
"identifier">right_open
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">,
</span><span class=
"number">4</span><span class=
"special">),
</span> <span class=
"number">1</span><span class=
"special">));
</span>
73 <span class=
"identifier">segment_vec
</span><span class=
"special">.
</span><span class=
"identifier">push_back
</span><span class=
"special">(
</span><span class=
"identifier">make_pair
</span><span class=
"special">(
</span><span class=
"identifier">discrete_interval
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">>::
</span><span class=
"identifier">right_open
</span><span class=
"special">(
</span><span class=
"number">4</span><span class=
"special">,
</span><span class=
"number">5</span><span class=
"special">),
</span> <span class=
"number">1</span><span class=
"special">));
</span>
74 <span class=
"identifier">segment_vec
</span><span class=
"special">.
</span><span class=
"identifier">push_back
</span><span class=
"special">(
</span><span class=
"identifier">make_pair
</span><span class=
"special">(
</span><span class=
"identifier">discrete_interval
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">>::
</span><span class=
"identifier">right_open
</span><span class=
"special">(
</span><span class=
"number">1</span><span class=
"special">,
</span><span class=
"number">3</span><span class=
"special">),
</span> <span class=
"number">1</span><span class=
"special">));
</span>
75 <span class=
"keyword">return
</span> <span class=
"identifier">segment_vec
</span><span class=
"special">;
</span>
76 <span class=
"special">}
</span>
78 <span class=
"comment">// 'show_segments' displays the source segements.
79 </span><span class=
"keyword">void
</span> <span class=
"identifier">show_segments
</span><span class=
"special">(
</span><span class=
"keyword">const
</span> <span class=
"identifier">vector
</span><span class=
"special"><</span><span class=
"identifier">pair
</span><span class=
"special"><</span><span class=
"identifier">discrete_interval
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">>,
</span> <span class=
"keyword">int
</span><span class=
"special">></span> <span class=
"special">>&</span> <span class=
"identifier">segments
</span><span class=
"special">)
</span>
80 <span class=
"special">{
</span>
81 <span class=
"identifier">vector
</span><span class=
"special"><</span><span class=
"identifier">pair
</span><span class=
"special"><</span><span class=
"identifier">discrete_interval
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">>,
</span> <span class=
"keyword">int
</span><span class=
"special">></span> <span class=
"special">>::
</span><span class=
"identifier">const_iterator
</span> <span class=
"identifier">iter
</span> <span class=
"special">=
</span> <span class=
"identifier">segments
</span><span class=
"special">.
</span><span class=
"identifier">begin
</span><span class=
"special">();
</span>
82 <span class=
"keyword">while
</span><span class=
"special">(
</span><span class=
"identifier">iter
</span> <span class=
"special">!=
</span> <span class=
"identifier">segments
</span><span class=
"special">.
</span><span class=
"identifier">end
</span><span class=
"special">())
</span>
83 <span class=
"special">{
</span>
84 <span class=
"identifier">cout
</span> <span class=
"special"><<</span> <span class=
"string">"("</span> <span class=
"special"><<</span> <span class=
"identifier">iter
</span><span class=
"special">-
></span><span class=
"identifier">first
</span> <span class=
"special"><<</span> <span class=
"string">","</span> <span class=
"special"><<</span> <span class=
"identifier">iter
</span><span class=
"special">-
></span><span class=
"identifier">second
</span> <span class=
"special"><<</span> <span class=
"string">")"</span><span class=
"special">;
</span>
85 <span class=
"special">++
</span><span class=
"identifier">iter
</span><span class=
"special">;
</span>
86 <span class=
"special">}
</span>
87 <span class=
"special">}
</span>
89 <span class=
"keyword">void
</span> <span class=
"identifier">std_copy
</span><span class=
"special">()
</span>
90 <span class=
"special">{
</span>
91 <span class=
"comment">// So we have some segments stored in an std container.
92 </span> <span class=
"identifier">vector
</span><span class=
"special"><</span><span class=
"identifier">pair
</span><span class=
"special"><</span><span class=
"identifier">discrete_interval
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">>,
</span> <span class=
"keyword">int
</span><span class=
"special">></span> <span class=
"special">></span> <span class=
"identifier">segments
</span> <span class=
"special">=
</span> <span class=
"identifier">make_segments
</span><span class=
"special">();
</span>
93 <span class=
"comment">// Display the input
94 </span> <span class=
"identifier">cout
</span> <span class=
"special"><<</span> <span class=
"string">"input sequence: "</span><span class=
"special">;
</span> <span class=
"identifier">show_segments
</span><span class=
"special">(
</span><span class=
"identifier">segments
</span><span class=
"special">);
</span> <span class=
"identifier">cout
</span> <span class=
"special"><<</span> <span class=
"string">"\n\n"</span><span class=
"special">;
</span>
96 <span class=
"comment">// We are going to 'std::copy' those segments into an interval_map:
97 </span> <span class=
"identifier">interval_map
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">,
</span><span class=
"keyword">int
</span><span class=
"special">></span> <span class=
"identifier">segmap
</span><span class=
"special">;
</span>
99 <span class=
"comment">// Use an 'icl::inserter' from
<boost/icl/iterator.hpp
> to call
100 </span> <span class=
"comment">// insertion on the interval container.
101 </span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">copy
</span><span class=
"special">(
</span><span class=
"identifier">segments
</span><span class=
"special">.
</span><span class=
"identifier">begin
</span><span class=
"special">(),
</span> <span class=
"identifier">segments
</span><span class=
"special">.
</span><span class=
"identifier">end
</span><span class=
"special">(),
</span>
102 <span class=
"identifier">icl
</span><span class=
"special">::
</span><span class=
"identifier">inserter
</span><span class=
"special">(
</span><span class=
"identifier">segmap
</span><span class=
"special">,
</span> <span class=
"identifier">segmap
</span><span class=
"special">.
</span><span class=
"identifier">end
</span><span class=
"special">()));
</span>
103 <span class=
"identifier">cout
</span> <span class=
"special"><<</span> <span class=
"string">"icl::inserting: "</span> <span class=
"special"><<</span> <span class=
"identifier">segmap
</span> <span class=
"special"><<</span> <span class=
"identifier">endl
</span><span class=
"special">;
</span>
104 <span class=
"identifier">segmap
</span><span class=
"special">.
</span><span class=
"identifier">clear
</span><span class=
"special">();
</span>
106 <span class=
"comment">// When we are feeding data into interval_maps, most of the time we are
107 </span> <span class=
"comment">// intending to compute an aggregation result. So we are not interested
108 </span> <span class=
"comment">// the std::insert semantincs but the aggregating icl::addition semantics.
109 </span> <span class=
"comment">// To achieve this there is an icl::add_iterator and an icl::adder function
110 </span> <span class=
"comment">// provided in
<boost/icl/iterator.hpp
>.
111 </span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">copy
</span><span class=
"special">(
</span><span class=
"identifier">segments
</span><span class=
"special">.
</span><span class=
"identifier">begin
</span><span class=
"special">(),
</span> <span class=
"identifier">segments
</span><span class=
"special">.
</span><span class=
"identifier">end
</span><span class=
"special">(),
</span>
112 <span class=
"identifier">icl
</span><span class=
"special">::
</span><span class=
"identifier">adder
</span><span class=
"special">(
</span><span class=
"identifier">segmap
</span><span class=
"special">,
</span> <span class=
"identifier">segmap
</span><span class=
"special">.
</span><span class=
"identifier">end
</span><span class=
"special">()));
</span> <span class=
"comment">//Aggregating associated values
113 </span> <span class=
"identifier">cout
</span> <span class=
"special"><<</span> <span class=
"string">"icl::adding : "</span> <span class=
"special"><<</span> <span class=
"identifier">segmap
</span> <span class=
"special"><<</span> <span class=
"identifier">endl
</span><span class=
"special">;
</span>
115 <span class=
"comment">// In this last case, the semantics of 'std::copy' transforms to the
116 </span> <span class=
"comment">// generalized addition operation, that is implemented by operator
117 </span> <span class=
"comment">// += or + on itl maps and sets.
118 </span><span class=
"special">}
</span>
120 <span class=
"keyword">int
</span> <span class=
"identifier">main
</span><span class=
"special">()
</span>
121 <span class=
"special">{
</span>
122 <span class=
"identifier">cout
</span> <span class=
"special"><<</span> <span class=
"string">">> Interval Container Library: Example std_copy.cpp <<\n"</span><span class=
"special">;
</span>
123 <span class=
"identifier">cout
</span> <span class=
"special"><<</span> <span class=
"string">"-----------------------------------------------------------\n"</span><span class=
"special">;
</span>
124 <span class=
"identifier">cout
</span> <span class=
"special"><<</span> <span class=
"string">"Using std::copy to fill an interval_map:\n\n"</span><span class=
"special">;
</span>
126 <span class=
"identifier">std_copy
</span><span class=
"special">();
</span>
127 <span class=
"keyword">return
</span> <span class=
"number">0</span><span class=
"special">;
</span>
128 <span class=
"special">}
</span>
130 <span class=
"comment">// Program output:
131 </span><span class=
"comment">/*---------------------------------------------------------
132 >> Interval Container Library: Example std_copy.cpp
<<
133 -----------------------------------------------------------
134 Using std::copy to fill an interval_map:
136 input sequence: ([
2,
4),
1)([
4,
5),
1)([
1,
3),
1)
138 icl::inserting: {([
1,
5)-
>1)}
139 icl::adding : {([
1,
2)-
>1)([
2,
3)-
>2)([
3,
5)-
>1)}
140 ---------------------------------------------------------*/
</span>
147 <table xmlns:
rev=
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width=
"100%"><tr>
148 <td align=
"left"></td>
149 <td align=
"right"><div class=
"copyright-footer">Copyright
© 2007 -
2010 Joachim Faulhaber
<br>Copyright
© 1999 -
2006 Cortex Software GmbH
<p>
150 Distributed under the Boost Software License, Version
1.0. (See accompanying
151 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>)
156 <div class=
"spirit-nav">
157 <a accesskey=
"p" href=
"user_groups.html"><img src=
"../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../examples.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=
"std_transform.html"><img src=
"../../../../../../doc/src/images/next.png" alt=
"Next"></a>