Что заставляет Boost `interval_map` игнорировать вставку?

Предполагается, что приведенный ниже код вставляет два интервала со связанными значениями 0 и 1 в карту интервалов Boost, но он вставляет только один:

#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)}

Если я изменю значение для «игнорируемой» строки на 1, пара будет вставлена ​​правильно.

Это почему?

3

Решение

Любой интервал домена с «без значения» имеет неявное «0» в совместной области. И наоборот. Я думаю, что следующий пример будет иметь смысл сразу:

m += std::make_pair(Interval::right_open(8,15), 1);
m -= std::make_pair(Interval::right_open(8,15), 1);

Результаты в пустой карте.

Увидеть Черты карты.

Icl-карты различаются по своему поведению в зависимости от того, как они обрабатывают элементы идентичности связанного типа CodomainT.

Специально под Определенность и хранение элементов идентичности

Вторая черта связана с представлением элементов идентичности на карте. Карта icl может быть поглотителем идентичности или обогащением идентичности.

  • Поглотитель идентичности никогда не хранит пары значений (k, 0), которые несут элементы идентичности.
  • Обогащение идентификаторов хранит пары значений (k, 0).
1

Другие решения

Других решений пока нет …