9

我正在使用来自 BOOST 库的interval_map 。

typedef set<int> Tpopulations;    
interval_map<int, Tpopulations> populations;

说我在人群中有这个

[1006311,1006353)   1611,1653,
[1006353,1006432)   1031,1611,1653,
[1006432,1006469]   1031,1387,1523,1611,1653,
(1006469,1006484]   1031,1387,1611,1653,
(1006484,1006496]   1031,1387,1611,
(1006496,1006506]   1031,1611,
(1006506,1006547]   1031,

现在我想找出某个数字上映射的内容:我希望是这样的:

cout << populations[1006313];  // 1611,1653

或者

cout << populations.at(1006313);  // 1611,1653

但是我似乎没有找到任何这样的方法。

我真的需要将另一个区间图定义为“窗口”并进行交叉吗?就像是:

interval_map<int, Tpopulations> window;
set<int>empty_set;
window +=(make_pair(1006313,empty_set));
cout << populations & window
4

2 回答 2

9

不,boost::icl::interval_map不包含这些元素访问功能。find但是,您可以使用该功能做您想做的事。

typedef std::set<int> Tpopulations;
typedef boost::icl::interval_map<int, Tpopulations> IMap;
typedef boost::icl::interval<int> Interval;
...
IMap m;
m += std::make_pair(Interval::right_open(1006311, 1006353), Tpopulations({1611, 1653}));
...
IMap::const_iterator it = m.find(1006313);
cout << it->first << endl;
...

上面的代码将为您提供间隔,其中包含数字 1006313。为了发送std::set<int>cout您需要额外的运算符:

inline std::ostream& operator<< (std::ostream& S, const Tpopulations& X)
{
  S << '(';
  for (ISet::const_iterator it = X.cbegin(); it != X.cend(); ++it)
  {
    if (it != X.cbegin()) S << ',';
    S << *it;
  }
  S << ')';
  return S;
}

然后下面的行将打印您想要的内容:

cout << it->second << endl;
于 2014-02-25T22:51:03.903 回答
2

是的,一个简单的解决方案是使用 () 找到您的映射元素。但是,要这样做,您必须设置地图 trait=total_absorber 以便覆盖整个范围。这是代码:

interval_map<int, Tpopulations, icl::total_absorber> populations;
Tpopulations valSet = populations(1006313);

然后,您将迭代valSet或覆盖operator<<上面提到的 @HEKTO 以实际打印出您的数据。

检查 boost 文档以在 interval_map 上进行选择。 该方法还给出了 O(log(N)) 的最佳预期性能

于 2015-01-21T20:58:09.567 回答