Есть ли в boost интервале_карты метод operator [] или .at ()?

я использую interval_map из библиотеки BOOST.

typedef set<int> Tpopulations;
interval_map<int, Tpopulations> populations;

Скажи у меня это в популяции

[1006311,1006353)   1611,1653,
[1006353,1006432)   1031,1611,1653,
[1006432,1006469]   1031,1387,1523,1611,1653,
(1006469,1006484]   1031,1387,1611,1653,
(1006484,1006496]   1031,1387,1611,
(1006496,1006506]   1031,1611,
(1006506,1006547]   1031,

Теперь я хочу узнать, что отображается на некотором числе: я ожидал бы что-то вроде:

cout << populations[1006313];  // 1611,1653

или же

cout << populations.at(1006313);  // 1611,1653

Однако я, кажется, не нашел такого метода.

Мне действительно нужно определить другую карту интервалов как «окно» и сделать пересечение? Что-то вроде:

interval_map<int, Tpopulations> window;
set<int>empty_set;
window +=(make_pair(1006313,empty_set));
cout << populations & window

9

Решение

Нет, boost::icl::interval_map не содержит этих функций доступа к элементам. Однако вы можете делать то, что вы хотите, используя find функция.

typedef std::set<int> Tpopulations;
typedef boost::icl::interval_map<int, Tpopulations> IMap;
typedef boost::icl::interval<int> Interval;
...
IMap m;
m += std::make_pair(Interval::right_open(1006311, 1006353), Tpopulations({1611, 1653}));
...
IMap::const_iterator it = m.find(1006313);
cout << it->first << endl;
...

Код выше даст вам интервал, который содержит номер 1006313. Для отправки std::set<int> к cout вам понадобится дополнительный оператор:

inline std::ostream& operator<< (std::ostream& S, const Tpopulations& X)
{
S << '(';
for (ISet::const_iterator it = X.cbegin(); it != X.cend(); ++it)
{
if (it != X.cbegin()) S << ',';
S << *it;
}
S << ')';
return S;
}

Тогда строка ниже напечатает то, что вы хотите:

cout << it->second << endl;
8

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

Да, простым решением было бы найти ваш сопоставленный элемент с помощью (). Однако, чтобы сделать это, вы должны установить trait = total_absorber вашей карты, чтобы охватить весь диапазон. Вот код:

interval_map<int, Tpopulations, icl::total_absorber> populations;
Tpopulations valSet = populations(1006313);

Затем вы будете перебирать valSet или переопределить operator<< как упомянуто выше @HEKTO, чтобы распечатать ваши данные.

Проверьте дополнительные документы для выбора на интервале_карте.
Этот метод также дает наилучшую ожидаемую производительность O (log (N))

2