0

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

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

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

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

我猜当用户快速点击所有月份时,拥有一个可以快速填充他点击的每个月的约会的地图表比从头到尾遍历向量更有效。

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

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

4

2 回答 2

1

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

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

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


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

于 2012-07-17T15:33:47.217 回答
0

您可以尝试使用带有键(年、月、日)和值作为约会列表/向量的平衡二叉搜索树。它应该给您O(logn)访问天数的复杂性。AFAIR std::mapstd::set(当然还有std::multiset)被实现为 RB(或 AVL)平衡二叉树。不过,你应该小心——这些结构的效率常数要大得多,所以你必须对你的应用程序进行基准测试。

于 2012-07-17T15:33:36.883 回答