- 我得到的是加起来的索引。但我正在寻找包含“探针”的区间的所有值(整数)。(路口?)
您可以使用您选择的组合器组合所有值(共域值) 。对于算术类型,这意味着求和。
如果你的 co-domain 是一个索引,显然 summation 是没有意义的组合器,你应该选择别的东西。
我可以用价值来实现这一点std::set<int>
,但在文档中指出,这对性能有巨大影响。
与往常一样,正确先于表现。如果这是你需要的,那就是你需要的。
似乎 split_interval_map 包含该信息,但我不知道如何检索它。
不适用于所选的共同域:如果间隔重叠(并且您使用add
,而不是set
),组合器会丢失原始信息。
我只需要像本例中那样的高效查找。我不再需要相交的区间范围。boost icl 对这个来说太重了吗?
您可以使用equal_range
代替lower_bound
/ upper_bound
:
Live On Coliru
for (auto probe : { 0.23, 1., 1.33, 1.57, 3.49, 3.51 }) {
std::cout << "\nprobe " << probe << ": ";
for (auto& p : boost::make_iterator_range(m.equal_range(Ival::closed(probe, probe)))) {
std::cout << p.second << " ";
}
}
印刷
probe 0.23:
probe 1: 1
probe 1.33: 1
probe 1.57: 4
probe 3.49: 4
probe 3.51: 3
观察:
m.add({Ival::closed(0., 1.), 0});
m.add({Ival::closed(1., 2.), 1});
m.add({Ival::closed(3., 4.), 2});
这些间隔巧妙地重叠。[0, 1]
并且[1, 2]
有[1,1]
共同点。你真的是这个意思left_open
吗?([0, 1)
并且[1, 2)
没有重叠)。
m.add({Ival::closed(2., 4.), 3});
m.add({Ival::closed(1.5, 3.5), 4});
如果您对它结合了重叠区间中已经存在的值这一事实感到惊讶,您是要替换它们吗?
m.set({Ival::closed(2., 4.), 3});
m.set({Ival::closed(1.5, 3.5), 4});
替代方案,想法:
您可以一次与一组探针进行交集:
Live On Coliru
Set probes;
probes.insert(0.23);
probes.insert(1.);
probes.insert(1.33);
probes.insert(1.57);
probes.insert(3.49);
probes.insert(3.51);
std::cout << std::endl << "all: " << (m & probes) << "\n";
印刷:
all: {([1,1]->1)([1.33,1.33]->1)([1.57,1.57]->4)([3.49,3.49]->4)([3.51,3.51]->3)}
(也许?)稍微优化一下:
Live On Coliru
using Map = icl::split_interval_map<double, boost::container::flat_set<int> >;
如果集合很小,请考虑为该 flat_set 的序列类型指定 small_vector:
icl::split_interval_map<double,
boost::container::flat_set<int, std::less<int>,
boost::container::small_vector<int, 4>
> >;
其他一切仍然有效:Live On Coliru
完全开箱即用:您是在为几何区域建模吗?就像时间轴上的间隔?或者只是轴上的线段?在这种情况下,考虑boost::geometry::index::rtree<>