用C ++效率结构创建日历应用程序

时间:2012-07-17 15:04:30

标签: c++ qt calendar

我正在用Qt / C ++创建一个日历应用程序,我正在决定如何制作这些结构。

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

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

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

我猜测,当用户快速浏览所有月份时,有一个地图表可以快速填写他点击的每个月的约会,而不是从头到尾迭代矢量,效率更高。< / p>

也许我可以从我的向量中保留每个月的迭代器?

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

2 个答案:

答案 0 :(得分:1)

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

如果您需要列出范围内的约会(例如,2012年1月),请使用std::map::equal_range并提供仅查看月份(或周或日)的比较函数。请注意,std::map::equal_range也具有对数复杂度。一旦你有一对相等范围的迭代器,遍历就是每个结果的恒定时间。

如果可能存在具有相同开始时间的重复约会,则您需要使用std::multimap代替。


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

答案 1 :(得分:0)

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