|
Boost Users : |
Subject: Re: [Boost-users] [ICL] interval_map question
From: Joachim Faulhaber (afojgo_at_[hidden])
Date: 2011-05-25 10:45:21
Hi Antal,
the output of your program is correct. This is because interval_maps
do *not* store interval value pairs (I,v), if v==0 or more precisely,
if v is the identity element of the codomain_type of associated
values.
2011/5/25 Antal A. Buss <abuss_at_[hidden]>:
> Hi all,
>
> I'm trying to use interval_map to implement some kind of range to
> value directory, but I have some non expected results.
>
> The test code I'm using is:
> ------------------------
> #include <iostream>
> #include <boost/icl/interval_map.hpp>
> #include <boost/icl/discrete_interval.hpp>
>
> using namespace std;
> using namespace boost::icl;
>
> int main(int argc, char const **argv)
> {
> interval_map<size_t, int> imap;
// use
interval_map<size_t, int, partial_enricher> imap;
// if you want to store zeroes as associated values.
> typedef discrete_interval<size_t> interval_t;
>
> imap += make_pair(construct<interval_t>(0, 7, interval_bounds::closed()),0);
> cout << "imap: " << imap << endl;
>
> imap.set(make_pair(construct<interval_t>(0, 0, interval_bounds::closed()),1));
> cout << "imap: " << imap << endl;
>
> imap.erase(construct<interval_t>(3, 3, interval_bounds::closed()));
> cout << "imap: " << imap << endl;
> }
> ------------------------
>
> The result I got is:
> imap: {}
> imap: {([0,0]->1)}
> imap: {([0,0]->1)}
Correct result, because [0,7]->0 is not stored. There is a MapTraits parameter
http://www.joachim-faulhaber.de/boost_icl/doc/libs/icl/doc/html/boost_icl/concepts/map_traits.html
Default for MapTraits is the value 'partial_absorber'. The _absorber
part of the name indicates, that interval-value-pairs associated to 0
are absorbed. So a segment of the interval_map "quantified" zero
disappears, keeping the map minimal.
If you need to store zeros, choose partial_enricher as MapTrait. It is
called _enricher, because (I,0)-segments, that may occur through
aggregating operations accumulate over time.
So using this type of interval map:
interval_map<size_t, int, partial_enricher> imap;
> but the result I was expecting is:
> imap: {([0,7]->0)}
> imap: {([0,0]->1)((0,7]->0)}
> imap: {([0,0]->1)((0,3)->0)((3,7]->0)}
you will get the desired result.
Best regards,
Joachim
-- Interval Container Library [Boost.Icl] http://www.joachim-faulhaber.de
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net