提升"interval_map" - 如何自定义触摸聚合
Boost `interval_map` - how to customize aggregating on touch
Boost ICLinterval_set
可以在将右开间隔添加到集合期间相互接触。例如,间隔[0,4)
和[4,8)
将联接起来成为间隔[0,8)
。
这对于interval_map
来说更复杂 - 间隔(相互接触并具有不同的关联值(将不会联接:
#include <iostream>
#include <utility>
#include <boost/icl/interval_map.hpp>
namespace icl = boost::icl;
using IMap = icl::interval_map<int, int>;
int main()
{
IMap m;
m += std::make_pair(IMap::interval_type::right_open(0, 4), 1);
m += std::make_pair(IMap::interval_type::right_open(4, 8), 2);
std::cout << m << std::endl;
}
该测试程序的输出如下:
{([0,4)->1)([4,8)->2)}
我知道如何自定义重叠聚合的过程,但是我需要自定义另一种情况 -触摸聚合。例如,如果区间相互接触,并且左区间的值等于右区间的值减去 1,则必须联接区间,并且生成的区间必须具有左区间的值。因此,上面的程序应该打印:
{([0,8)->1)}
是否可以使用当前可用的 Boost ICL 来做到这一点?
我可以使用interval_map
的奇怪操作来做我想做的事,但我认为这会很麻烦且效率低下。我宁愿被指出正确的方向来使用当前可用的 ICL 自定义、函子等。
这对于interval_map来说更复杂 - 相互接触并具有不同关联值的间隔不会连接:
真的没有区别。
我知道如何自定义重叠聚合的过程,但是我需要自定义另一种情况 - 触摸聚合。
你似乎暗示
m += std::make_pair(IMap::interval_type::right_open(4, 8), 2);
将插入[4, 8) -> 2
.
事实并非如此。这是一个共域组合操作,结果取决于映射的先前状态。
当然,你可以这样写:
m.set({Ival::right_open(4, 8), 2});
如果需要,可以查询前面的槽,因此操作可能如下所示:
// returns true if joined with preceding slot
bool fill_slot(IMap& m, int from, int till, int value) {
bool joined = false;
auto slot = Ival::right_open(from, till);
if (within(slot, m)) {
// There is overlap, I don't know how you want to handle this.
// You can add some logic here.
} else {
auto preceding = m(from - 1);
if (preceding && value == preceding + 1) {
joined = true;
value = preceding;
}
}
m.set({slot, value});
return joined;
}
现在您可以编写如下测试用例:
int main() {
{
IMap m;
fill_slot(m, 0, 4, 1);
fill_slot(m, 4, 8, 2);
std::cout << m << std::endl;
}
{
IMap m;
fill_slot(m, 0, 4, 1);
fill_slot(m, 4, 8, 3);
std::cout << m << std::endl;
}
{
IMap m;
fill_slot(m, 0, 4, 1);
fill_slot(m, 5, 8, 2);
std::cout << m << std::endl;
}
}
他们打印了Live On Coliru
{([0,8)->1)}
{([0,4)->1)([4,8)->3)}
{([0,4)->1)([5,8)->2)}
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 参数化自定义CMake工具链
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何在自定义类中启用'auto loops'?
- 使用QJsEngine在Qt中注册自定义类型
- Qt自定义QPush按钮未显示在布局上
- 自定义对象的dlib序列化在gcc中失败
- 自定义创建QFuture
- 如何在QT中的自定义视频小工具t上绘制矩形