ПримерПартияпоказывает возможности интервальной карты<interval_map
>или<split_interval_map
>.<interval_map
>отображает интервалы для данного содержимого. В этом случае контент представляет собой набор гостей вечеринки, представленный их струнами имен.
Со временем группы людей присоединяются к вечеринке и уходят позже вечером. Поэтому мы добавляем временной интервал и имя, установленное для<interval_map
>посещаемости каждой группы людей, которые собираются вместе и уходят вместе. На каждом перекрытии интервалов накапливаются соответствующие наборы имен. В точках перекрытия интервалы разделяются. Накопление контента осуществляется через оператор +=, который должен быть реализован для параметра контента<interval_map
>. Наконец, интервал_map содержит историю посещаемости и все моменты времени, где группа гостей вечеринки изменилась.
Сторона демонстрирует принцип, который мы называемсовокупным наложением: При вставке значение, связанное с интервалом, агрегируется с теми значениями в интервале_map, которые перекрываются со вставленным значением. Есть два поведенческих аспектасовокупного наложения:декомпозиционного поведенияиаккумулятивного поведения.
- декомпозиционное поведениеразделяет интервалы навремяизмерениеинтервала_карты так, что интервалы разделяются всякий раз, когда связанные значения изменяются.
- аккумулятивное поведениенакапливает ассоциированные значения на каждом перекрытии вставки для ассоциированных значений.
Функция агрегации по умолчанию +=. При желании можно использовать различные агрегаты.
#include <boost/icl/ptime.hpp>
#include <iostream>
#include <boost/icl/interval_map.hpp>
using namespace std;
using namespace boost::posix_time;
using namespace boost::icl;
typedef std::set<string> GuestSetT;
void boost_party()
{
GuestSetT mary_harry;
mary_harry.insert("Mary");
mary_harry.insert("Harry");
GuestSetT diana_susan;
diana_susan.insert("Diana");
diana_susan.insert("Susan");
GuestSetT peter;
peter.insert("Peter");
interval_map<ptime, GuestSetT> party;
party.add(
make_pair(
interval<ptime>::right_open(
time_from_string("2008-05-20 19:30"),
time_from_string("2008-05-20 23:00")),
mary_harry));
party +=
make_pair(
interval<ptime>::right_open(
time_from_string("2008-05-20 20:10"),
time_from_string("2008-05-21 00:00")),
diana_susan);
party +=
make_pair(
interval<ptime>::right_open(
time_from_string("2008-05-20 22:15"),
time_from_string("2008-05-21 00:30")),
peter);
interval_map<ptime, GuestSetT>::iterator it = party.begin();
cout << "----- History of party guests -------------------------\n";
while(it != party.end())
{
interval<ptime>::type when = it->first;
GuestSetT who = (*it++).second;
cout << when << ": " << who << endl;
}
}
int main()
{
cout << ">>Interval Container Library: Sample boost_party.cpp <<\n";
cout << "-------------------------------------------------------\n";
boost_party();
return 0;
}
![[Caution]](/img/caution.png) | Caution |
---|
Мы вводим<interval_maps >с помощьюинтервальной картынаборов струниз-за ее дидактических преимуществ. Партийный пример используется, чтобы дать немедленный доступ к основным идеям интервальных карт иагрегата на перекрытии. Для приложений реального мира не обязательно рекомендуется интервальная карта наборов. Он имеет те же проблемы эффективности, что и<std::map >из<std::sets >. Существует большая область использования интервальных карт с числовыми и другими эффективными типами данных для соответствующих значений. |