Что заставляет Boost `interval_map` игнорировать вставку? - PullRequest
0 голосов
/ 12 июня 2018

Предполагается, что приведенный ниже код вставляет два интервала со связанными значениями 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)}

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

Почему это так?

1 Ответ

0 голосов
/ 13 июня 2018

Любой интервал домена с "без значения" имеет неявное "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), которые содержат элементы идентификаторов.
  • Обогащитель идентификационных данных сохраняет значениепары (к, 0).
...