use*_*931 2 c++ boost intervals
boost::icl::interval_set<uint> test_set;
test_set.insert(boost::icl::discrete_interval<uint>::closed(10u, 20u));
test_set.insert(boost::icl::discrete_interval<uint>::closed(21u, 30u)); //should merge to single interval
test_set.insert(boost::icl::discrete_interval<uint>::closed(15u, 25u)); //should not change
test_set.erase(boost::icl::discrete_interval<uint>::closed(12u, 18u)); //should split in two intervals
uint i1min = test_set.begin()->lower();
uint i1max = test_set.begin()->upper();
uint i2min = (++test_set.begin())->lower();
uint i2max = (++test_set.begin())->upper();
std::cout<<i1min<<"\n";
std::cout<<i1max<<"\n";
std::cout<<i2min<<"\n";
std::cout<<i2max<<"\n";
Run Code Online (Sandbox Code Playgroud)
由于我正在添加和减去闭区间,因此我希望得到以下输出:
10
11
19
30
Run Code Online (Sandbox Code Playgroud)
但我得到:
10
12
18
30
Run Code Online (Sandbox Code Playgroud)
为什么我要删除的间隔的端点仍然存在?这是减去闭区间的预期行为还是我做错了什么?
从另一个中减去一个闭区间,在您的情况下会导致两个半开区间。如果您考虑一下,它也与连续间隔的行为一致。
您可以使用以下代码对此进行测试:
std::cout << test_set.begin()->bounds() << "\n";
std::cout << (++test_set.begin())->bounds() << "\n";
Run Code Online (Sandbox Code Playgroud)
这输出:[)并(]显示结果间隔是半开的,这意味着12和18不包括在您的间隔集中。
要获取(可能是开放的)离散区间的第一个/最后一个元素,请使用函数first和last(此处的文档):
uint i1min = boost::icl::first(*test_set.begin());
uint i1max = boost::icl::last(*test_set.begin());
uint i2min = boost::icl::first(*(++test_set.begin()));
uint i2max = boost::icl::last(*(++test_set.begin()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
707 次 |
| 最近记录: |