gpt4 book ai didi

c++ - 使用 Boost ICL 查找范围包含一个点的所有对象

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:40 24 4
gpt4 key购买 nike

我得到了一个对象列表 L,每个对象都包含一个添加时间、一个删除时间、一个名称和一些其他字段。给定时间 T,我想返回一个列表,该列表仅包含 L 中的对象,其中 T 介于对象的添加时间和删除时间之间(此外,我想同时搜索具有特定名称的所有对象,但它不是如果它使事情复杂化,这是必要的)。我将如何使用 Boost 的 ICL 来做到这一点?

最佳答案

假设您的对象看起来像

struct record {
std::string name;

using ptime = boost::posix_time::ptime;
ptime added, removed;
};

现在,让我们添加一个方便的方法,以便我们可以更轻松地处理时间间隔:

    icl::interval<ptime>::interval_type validity() const { 
icl::interval<ptime> x;
return x.right_open(added, removed);
}

一个简单的测试程序如下所示:

int main()
{
ptime const start(day_clock::local_day(), { });

std::vector<record> L {
{ "long" , start + hours(77) , start + days(7) } ,
{ "medium" , start + hours(200), start + hours(236) },
{ "short" , start + hours(220), start + hours(226) },
{ "ephemeral", start + hours(100), start + hours(101) },
};

for (ptime T = start; T <= (start + days(10)); T += hours(6))
{
std::cout << "\nT:" << T << "\t";
std::ostream_iterator<record> out(std::cout, ";");
std::copy_if(L.begin(), L.end(), out, [T](record const& r) { return icl::contains(r.validity(), T); });
}
}

它以 6 小时为步长在 10 天的范围内迭代时间点 T,并从 L 打印匹配对象,参见 Live On Coliru

T:2014-Jun-06 00:00:00  
T:2014-Jun-06 06:00:00
T:2014-Jun-06 12:00:00
T:2014-Jun-06 18:00:00
T:2014-Jun-07 00:00:00
T:2014-Jun-07 06:00:00
T:2014-Jun-07 12:00:00
T:2014-Jun-07 18:00:00
T:2014-Jun-08 00:00:00
T:2014-Jun-08 06:00:00
T:2014-Jun-08 12:00:00
T:2014-Jun-08 18:00:00
T:2014-Jun-09 00:00:00
T:2014-Jun-09 06:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-09 12:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-09 18:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-10 00:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-10 06:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-10 12:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-10 18:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-11 00:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-11 06:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-11 12:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-11 18:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-12 00:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-12 06:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-12 12:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-12 18:00:00 {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
T:2014-Jun-13 00:00:00
T:2014-Jun-13 06:00:00
T:2014-Jun-13 12:00:00
T:2014-Jun-13 18:00:00
T:2014-Jun-14 00:00:00
T:2014-Jun-14 06:00:00
T:2014-Jun-14 12:00:00 {medium, 2014-Jun-14 08:00:00, 2014-Jun-15 20:00:00};
T:2014-Jun-14 18:00:00 {medium, 2014-Jun-14 08:00:00, 2014-Jun-15 20:00:00};
T:2014-Jun-15 00:00:00 {medium, 2014-Jun-14 08:00:00, 2014-Jun-15 20:00:00};
T:2014-Jun-15 06:00:00 {medium, 2014-Jun-14 08:00:00, 2014-Jun-15 20:00:00};{short, 2014-Jun-15 04:00:00, 2014-Jun-15 10:00:00};
T:2014-Jun-15 12:00:00 {medium, 2014-Jun-14 08:00:00, 2014-Jun-15 20:00:00};
T:2014-Jun-15 18:00:00 {medium, 2014-Jun-14 08:00:00, 2014-Jun-15 20:00:00};
T:2014-Jun-16 00:00:00

如您所见,"ephemeral" 太短了,使用这种方法会完全忽略它!您可能希望在时隙中遍历时间,而不是逐步遍历时间点:

for (auto Slot = icl::interval<ptime>::right_open(start, start + hours(6));
Slot.lower() <= (start + days(10));
Slot = icl::interval<ptime>::right_open(Slot.upper(), Slot.upper() + hours(6)))
{
std::cout << "\nSlot:" << Slot << "\t";
std::ostream_iterator<record> out(std::cout, ";");
std::copy_if(L.begin(), L.end(), out, [Slot](record const& r) { return icl::intersects(Slot, r.validity()); });
}

看到那个 Live On Coliru 也是,观察如何不再遗漏 “ephemeral”:

...
Slot:[2014-Jun-09 18:00:00,2014-Jun-10 00:00:00) {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
Slot:[2014-Jun-10 00:00:00,2014-Jun-10 06:00:00) {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};{ephemeral, 2014-Jun-10 04:00:00, 2014-Jun-10 05:00:00};
Slot:[2014-Jun-10 06:00:00,2014-Jun-10 12:00:00) {long, 2014-Jun-09 05:00:00, 2014-Jun-13 00:00:00};
...

关于c++ - 使用 Boost ICL 查找范围包含一个点的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24084545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com