Another side note on this to make the issue more comprehensible.
An interval_map is usable as a map, but it is also an aggregation
device. You may think of it a "counter" or "quantifier" for associated
"things" that can occur in time (e.g. count number of party guests).
Looking from this important use case it is often desirabel to omit
segments from the map, that are counted 0 times (in other words, that
are zero-quantified).
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; 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)}
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)}
So again, from the perspective of counting or "quantification" both results are equal, if we are not interested in zero-counted segments. If we omit the zero-quantified segments in the second imap, it equals the first one. Thank you for the question. This is probably a trap for many users, because it is different from the standard semantics of a std::map that we tend to expect. From the perspective of most use cases of interval_map as a means for aggregation though, the current default-behavior seems to be justified. HTH, Joachim -- Interval Container Library [Boost.Icl] http://www.joachim-faulhaber.de