我正在使用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
但是我似乎没有找到任何这样的方法。
我真的需要将anoher间隔图定义为“窗口”并进行交叉吗?类似的东西:
interval_map<int, Tpopulations> window;
set<int>empty_set;
window +=(make_pair(1006313,empty_set));
cout << populations & window
答案 0 :(得分: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;
答案 1 :(得分:2)
是的,一个简单的解决方案是用()找到你的映射元素。但是,要这样做,您必须设置地图trait = total_absorber,以便覆盖整个范围。这是代码:
interval_map<int, Tpopulations, icl::total_absorber> populations;
Tpopulations valSet = populations(1006313);
然后,您将迭代valSet
或覆盖operator<<
上面提到的@HEKTO,以实际打印出您的数据。
Check the boost documents for selection on interval_map. 该方法还给出了O(log(N))
的最佳预期性能