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

C++ 在C+中创建日历应用程序+;效率结构,c++,qt,calendar,C++,Qt,Calendar,我正在用Qt/C++创建一个日历应用程序,并决定如何制作结构 到目前为止,我所做的是:创建约会的排序向量(按升序开始日期排序) 我想知道,如果我添加一个std::map,其中有52个位置(每周1个),并且在每个位置都有一个指向该周约会的指针向量,是否可以提高性能。获得1月份的约会将在固定的时间内进行(有点像-接受前4周的所有指示)。缺点:每次用户编辑/删除/创建约会时,都必须重新构建此表 我也可以使用向量搜索1月份开始的第一个约会,然后查找1月份的最后一个约会。这将在线性时间(N)内发生 我猜,

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

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

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

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

我猜,当用户在所有月份快速点击时,拥有一个映射表,可以快速填充他点击的每个月的约会,比从开始到结束遍历向量更有效

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


有什么建议吗如果我把它放错了,请原谅。

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

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

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

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



作为一般的“最佳实践”指南,您应该努力以紧凑的数字格式存储日期/时间(如
time\t
),并且仅为输入/输出目的进行转换。这与将数值存储/计算为int、float等,并仅将其格式化为字符串以用于输入/输出的原理相同。如果您想使用一个方便的日期/时间包装类(可以方便地访问天、小时、分钟等),那么请查看库或C++11。那些日期/时间包装器应该已经定义了
操作符。对我来说,最明显的结构是每天的约会排序列表,以天为向量,以月为向量。有什么原因不适合您的目的吗?比如说,我使用tm结构来定义我的时间,让我可以快速访问月、日等。。。是为tm创建一个比较函数更有效,还是简单地将tm转换为时间并进行比较更有效?@学生们,我的直觉是,比较要比转换多得多。如果性能真的很重要,您可以尝试两种方法和基准测试。另请参见我的编辑。