2012-07-17 92 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)平衡二叉樹。但是,您應該謹慎 - 這些結構具有更高的效率,因此您必須對應用程序進行基準測試。