示例 party 演示了区间映射 (interval_map
或 split_interval_map
) 的可能性。 interval_map
将区间映射到一个给定的内容。在本例中,内容是以姓名字符串表示的聚会客人集合。
随着时间的推移,一群人加入聚会,然后在晚上离开。因此,我们为每个群体(一起来,一起走)的出席情况,向 interval_map
添加一个时间区间和一个姓名集合。在区间的所有重叠处,相应的姓名集合会被累加。在重叠点,区间会被分割。内容的累加是通过一个 += 操作符完成的,这个操作符必须为 interval_map
的内容参数实现。最后,interval_map 包含了出席的历史记录以及聚会客人分组发生变化的所有时间点。
Party 演示了一个我们称之为 重叠聚合 的原理:在插入时,与区间相关联的值会与 interval_map 中与插入值重叠的那些值进行聚合。 重叠聚合 有两个行为方面:分解行为 和 累加行为。
聚合函数默认为 +=。如果需要,也可以使用不同的聚合函数。
// The next line includes <boost/date_time/posix_time/posix_time.hpp> // and a few lines of adapter code. #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; // Type set<string> collects the names of party guests. Since std::set is // a model of the itl's set concept, the concept provides an operator += // that performs a set union on overlap of intervals. 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"); // A party is an interval map that maps time intervals to sets of guests interval_map<ptime, GuestSetT> party; party.add( // add and element 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 += // element addition can also be done via operator += 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; // Who is at the party within the time interval 'when' ? 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; } // Program output: /*----------------------------------------------------------------------------- >>Interval Container Library: Sample boost_party.cpp << ------------------------------------------------------- ----- History of party guests ------------------------- [2008-May-20 19:30:00, 2008-May-20 20:10:00): Harry Mary [2008-May-20 20:10:00, 2008-May-20 22:15:00): Diana Harry Mary Susan [2008-May-20 22:15:00, 2008-May-20 23:00:00): Diana Harry Mary Peter Susan [2008-May-20 23:00:00, 2008-May-21 00:00:00): Diana Peter Susan [2008-May-21 00:00:00, 2008-May-21 00:30:00): Peter -----------------------------------------------------------------------------*/
![]() |
注意 |
---|---|
我们引入 |