コレクション クラスの選択に関する推奨事項
更新 : 2007 年 11 月
ここでは、アプリケーション固有の条件に合わせてコレクション クラスを選択する方法について詳しく説明します。
コレクション クラスの選択には、多くの条件を考慮する必要があります。次に、主な選択条件を示します。
順序付け、インデックス、操作性など、クラス形状の特性。下の表「コレクションの形状とその特徴」を参照してください。
クラスで C++ テンプレートを使用しているか
コレクションに格納されている要素をシリアル化できるか
コレクションに格納されている要素を診断用にダンプできるか
タイプ セーフなコレクションか
次の表「コレクションの形状とその特徴」は、コレクション形状による特性の違いの一覧です。
2 列目と 3 列目は、形状による順序付けとアクセス方法の違いです。"順序付け" とは、要素を挿入または削除した順によってコレクション内の要素の位置が決まることです。要素を内容別に並べ替えることはできません。"インデックス付き" の場合は、コレクション内の要素を整数インデックスによって取り出すことができます。通常の配列では項目にインデックスが付いています。
4 列目と 5 列目は、各形状の操作性です。頻繁にコレクションに要素を挿入するアプリケーションでは、要素の挿入スピードが特に重要です。ほかのアプリケーションでは、検索スピードがより重要です。
6 列目は、要素を重複できるかどうかです。
コレクションの形状とその特徴
形状 |
順序付き |
インデックス付き |
要素の挿入速度 |
要素の検索速度 |
要素の重複 |
---|---|---|---|---|---|
リスト |
○ |
× |
速い |
遅い |
○ |
配列 |
○ |
int によるインデックス |
遅い |
遅い |
○ |
マップ |
× |
キーによるインデックス |
速い |
速い |
× (同じキーは不可) ○ (同じ値でも可) |
次の表「MFC コレクション クラスの特徴」に、MFC のコレクション クラス別に特徴をまとめます。クラスの選択基準として次の 4 つがあります。つまり、C++ テンプレートを使用しているか、MFC のドキュメント シリアル化機構で要素をシリアル化できるか、MFC の診断ダンプ機構で要素をダンプできるか、タイプ セーフなクラスか (つまり、そのクラスのコレクションでは、格納または取得する要素の型が保証されるか) の 4 つです。
MFC コレクション クラスの特徴
クラス |
C++ テンプレートの使用 |
シリアル化 できるか |
ダンプ できるか |
タイプ セーフ付き か |
---|---|---|---|---|
CArray |
○ |
○ 1 |
○ 1 |
× |
CByteArray |
× |
○ |
○ |
○ 3 |
CDWordArray |
× |
○ |
○ |
○ 3 |
CList |
○ |
○ 1 |
○ 1 |
× |
CMap |
○ |
○ 1 |
○ 1 |
× |
CMapPtrToPtr |
× |
× |
○ |
× |
CMapPtrToWord |
× |
× |
○ |
× |
CMapStringToOb |
× |
○ |
○ |
× |
CMapStringToPtr |
× |
× |
○ |
× |
CMapStringToString |
× |
○ |
○ |
○ 3 |
CMapWordToOb |
× |
○ |
○ |
× |
CMapWordToPtr |
× |
× |
○ |
× |
CObArray |
× |
○ |
○ |
× |
CObList |
× |
○ |
○ |
× |
CPtrArray |
× |
× |
○ |
× |
CPtrList |
× |
× |
○ |
× |
CStringArray |
× |
○ |
○ |
○ 3 |
CStringList |
× |
○ |
○ |
○ 3 |
CTypedPtrArray |
○ |
基になるコレクションの型に依存する 2 |
○ |
○ |
CTypedPtrList |
○ |
基になるコレクションの型に依存する 2 |
○ |
○ |
CTypedPtrMap |
○ |
基になるコレクションの型に依存する 2 |
○ |
○ |
CUIntArray |
× |
× |
○ |
○ 3 |
CWordArray |
× |
○ |
○ |
○ 3 |
1. シリアル化を行うには、コレクション オブジェクトの Serialize 関数を明示的に呼び出します。ダンプを行うには、Dump 関数を明示的に呼び出します。式 ar << collObj ではシリアル化できません。また、式 dmp << collObj ではダンプできません。
2. シリアル化ができるかどうかは、基になるコレクションの型によります。たとえば、型付きポインタ配列のベースが CObArray の場合は、シリアル化できますが、ベースが CPtrArray の場合はシリアル化できません。通常、"Ptr" が付くクラスはシリアル化できません。
3. 非テンプレート コレクション クラスでこの列が "○" の場合は、そのクラスの用途どおりに使うと、タイプ セーフとなります。たとえば、CByteArray にバイト データを格納すると、その配列はタイプ セーフです。しかし、文字データを格納すると、タイプ セーフは保証されません。