Boost中的`interval_map`为什么会忽略插入操作?

3
下面的代码应该向Boost区间映射中插入两个带有关联值0和1的区间,但它只插入了一个:
#include <iostream>

#include <boost/icl/interval_map.hpp>

using Interval = boost::icl::interval<int>;
using IMap = boost::icl::interval_map<int, int>;

int main()
{
  IMap m;
  m += std::make_pair(Interval::right_open(0, 7), 0);  // <== ignored?
  m += std::make_pair(Interval::right_open(8,15), 1);
  std::cout << m << std::endl;
}

输出:

{([8,15)->1)}

如果我将“ignored”行的值更改为1,则它将正确地插入该对。这是为什么呢?
1个回答

1
任何带有“无值”区间的定义域,在对应域中都有隐含的“0”。反之亦然。我猜下面的示例会立即让人明白:
m += std::make_pair(Interval::right_open(8,15), 1);
m -= std::make_pair(Interval::right_open(8,15), 1);

得到一个空映射的结果。

请参阅Map Traits

Icl maps在处理关联类型CodomainT的标识元素时表现出不同的行为。

具体来说,请参阅Definedness and Storage of Identity Elements

第二个特征与地图中标识元素的表示有关。ic lmap 可以是标识吸收器或标识丰富剂。

  • 标识吸收器永远不会存储携带标识元素的值对(k,0)。
  • 标识丰富剂存储值对(k,0)。

我认为页面https://www.boost.org/doc/libs/1_67_0/libs/icl/doc/html/boost_icl/concepts/map_traits.html更好地描述了身份元素的情况。您可以更新您的答案,我会接受它。 - HEKTO
@HEKTO,你说得很对。我记得看过那个页面,但找不到了。确实更好。 - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接