0

Qt / C ++でカレンダーアプリを作成していて、構造の作成方法を決定しています。

私がこれまでに行ったこと:予定の並べ替えられたベクトルを作成します(開始日の昇順で並べ替えられます)。

52の場所(毎週1つ)と各スポットにその週の予定へのポインターのベクトルを含むstd :: mapを追加すると、パフォーマンスが向上するかどうか疑問に思っています。たとえば1月の予定を取得することは、一定の時間で行われます(最初の4週間のすべてのポインタを取得するようなものです)。短所:ユーザーが予定を編集/削除/作成するたびに、このテーブルを再構築する必要があります。

ベクトルを使用して、1月に開始する最初の予定を検索し、1月に最後の予定を検索することもできます。これは線形時間(N)で発生します。

ユーザーがすべての月をすばやくクリックする場合、最初から最後までベクトルを繰り返すよりも、クリックする各月の予定をすばやく埋めることができるマップテーブルを用意する方が効率的だと思います。

多分私は私のベクトルから毎月のイテレータを保つことができますか?

何かアドバイス?-これを間違ったスタックに置いた場合も失礼します。

4

2 に答える 2

1

データベースを使用しない場合は、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

于 2012-07-17T15:33:47.217 に答える
0

キー(年、月、日)と、予定のリスト/ベクトルとしての値を使用して、バランスの取れた二分探索木を使用してみることができます。それはあなたO(logn)に日へのアクセスの複雑さを与えるはずです。AFAIR std::mapstd::set(そしてもちろんstd::multiset)は、RB(またはAVL)のバランスの取れた二分木として実装されます。ただし、注意が必要です。これらの構造は効率の定数がはるかに大きいため、アプリのベンチマークを行う必要があります。

于 2012-07-17T15:33:36.883 に答える