2012-07-17 42 views
0

我在Qt/C++中创建日历应用程序,并决定如何制作结构。在C++效率结构中创建日历应用程序

我到目前为止做了什么:创建排序的预约向量(按升序开始日期排序)。

我想知道如果我在52个地方(每周1个)添加一个std :: map,并在每个地点指向这个星期的约会指针,它是否可以提高性能。获得例如约会一月会在不变的时间内发生(有点 - 以前4周的所有指标)。缺点:每次用户编辑/删除/创建约会时,都必须重建该表格。

我也可以使用矢量并搜索1月份开始的第一个约会,然后在1月份查找最后一个约会。这会在线性时间(N)内发生。

我猜测,当用户快速点击所有月份时,有一个地图表可以快速填充他点击的每个月的约会,而不是从头到尾循环遍历矢量。

也许我可以从我的矢量每个月保持迭代器?

有什么建议吗? - 也请原谅,如果我把它放在错误的堆栈。

+1

对我来说,最明显的结构是每天约会的排序列表,以向量为单位的天数向量。有没有理由不符合你的目的? – jxh 2012-07-17 15:11:29

回答

1

如果你不打算使用数据库,你可以尝试使用一个大的std::map<time_t, Appointment>(而不是time_t,你也可以使用一些可以轻松比较的其他时间类型)。 std::map将保持约会的排序,因为他们插入。插入/查找/擦除只需要对数时间。

当您需要在一个范围内(例如2012年1月)列出约会时,请使用std::map::equal_range并提供仅在月份(或星期或日期)显示的比较函子。请注意0​​也是对数复杂的。一旦你有一对迭代器到相同的范围,遍历是每个结果的常量时间。

如果可能有重复的约会具有相同的开始时间,则需要改为使用std::multimap


作为一般的“最佳实践”指南,你应该努力来存储您的日期/在一个紧凑的数字格式的时间(如time_t),只转换输入/输出的目的。它与int,float等存储/计算数值的原理相同,只是将它们格式化为输入/输出字符串。如果您想使用方便的日期/时间包装类(可轻松访问日,小时,分钟等),请查看Boost.DateTime库或C++ 11的std::chrono。那些日期/时间包装器应该已经定义了operator<,因此它们可以直接用作std::map中的密钥类型。

+0

假设我使用tm-struct来定义我的时间,使我能够快速访问月份,日期等等......为tm创建比较函数或简单地将tm转换为time_t并比较它们? – TheDudeAbides 2012-07-18 17:26:36

+0

@TheDudeAbides,我的直觉是,会有比转换更多的比较。如果性能真的很重要,你可以尝试两种方式和基准。另请参阅我的编辑。 – 2012-07-24 00:02:53

0

您可以尝试使用带键(年,月,日)的平衡二进制搜索树以及值作为约会列表/向量。它应该给你访问日期的复杂性O(logn)。 AFAIR std::mapstd::set(当然还有std::multiset)被实现为RB(或AVL)平衡二叉树。但是,您应该谨慎 - 这些结构具有更高的效率,因此您必须对应用程序进行基准测试。