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
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
#include using namespace std; using namespace boost::icl;
int main(int argc, char const **argv) { interval_map
imap;
// use
interval_map
typedef discrete_interval
interval_t; imap += make_pair(construct
(0, 7, interval_bounds::closed()),0); cout << "imap: " << imap << endl; imap.set(make_pair(construct
(0, 0, interval_bounds::closed()),1)); cout << "imap: " << imap << endl; imap.erase(construct
(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/co...
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
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