ATL コレクション クラス
ATL には、データを格納してそれにアクセスするための多くのクラスが用意されています。 どのクラスを使用するかの決定は、次のようないくつかの要因によって異なります。
格納するデータの量
データへのアクセス時の効率とパフォーマンス
インデックスまたはキーによってデータにアクセスする機能
データの順序付け方法
個人設定
小規模コレクション クラス
ATL には、少数のオブジェクトを処理するための次の配列クラスが含まれています。 ただし、これらのクラスは制限されていて、ATL による内部的な使用を目的として設計されています。 ご利用のプログラム内で、それらを使用することは推奨されていません。
クラス | データ ストレージの種類 |
---|---|
CSimpleArray | 少数のオブジェクトを処理するための配列クラスを実装します。 |
CSimpleMap | 少数のオブジェクトを処理するためのマッピング クラスを実装します。 |
汎用コレクション クラス
次のクラスは、配列、リスト、マップを実装するためのものであり、汎用コレクション クラスとして提供されます。
クラス | データ ストレージの種類 |
---|---|
CAtlArray | 配列を実装します。 |
CAtlList | リストを実装します。 |
CAtlMap | マッピング構造を実装します。キーまたは値でデータを参照できます。 |
CRBMap | Red-Black アルゴリズムを使用したマッピング構造を実装します。 |
CRBMultiMap | Red-Black 一対多の構造を実装します。 |
これらのクラスをデバッグ ビルドで使用すると、多くのプログラミング エラーがトラップされます。しかし、パフォーマンスを考慮して、これらのチェックは小売ビルドでは実行されません。
特殊なコレクション クラス
メモリ ポインターとインターフェイス ポインターの管理により特化されたコレクション クラスも用意されています。
クラス | 目的 |
---|---|
CAutoPtrArray | スマート ポインターの配列を構築する際に役立つメソッドを提供します。 |
CAutoPtrList | スマート ポインターのリストを構築する際に役立つメソッドを提供します。 |
CComUnkArray | IUnknown ポインターを格納します。IConnectionPointImpl テンプレート クラスのパラメーターとして使用するように設計されています。 |
CHeapPtrList | ヒープ ポインターのリストを構築する際に役立つメソッドを提供します。 |
CInterfaceArray | COM インターフェイス ポインターの配列を構築する際に役立つメソッドを提供します。 |
CInterfaceList | COM インターフェイス ポインターのリストを構築するときに役立つメソッドを提供します。 |
コレクション クラスの選択
次の表に示すように、使用可能なコレクション クラスごとのパフォーマンス特性は異なるものとなります。
2 列目と 3 列目は、各クラスの順序付けとアクセスに関する特性を示しています。 表に使用されている用語 "順序付け" とは、項目を挿入または削除した順によってコレクション内の項目の位置が決まることを意味します。項目がその内容によって並べ替えられることを意味するのではありません。 用語 "インデックス付き" は、通常の配列内の項目と同様に、コレクション内の項目を整数インデックスによって取得できることを意味します。
4 列目と 5 列目は、各クラスのパフォーマンスを表しています。 頻繁にコレクションに項目を挿入するアプリケーションでは、項目の挿入速度が特に重要です。他のアプリケーションでは、検索速度の方がより重要になる場合があります。
6 列目は、各形状で項目の重複が許可されるかどうかを表しています。
特定のコレクション クラス操作のパフォーマンスは、操作を完了するのに必要な時間とコレクション内の要素の数との関係で表されます。 要素の数が増えるに従って、所要時間が線形的に増加する操作は、O(n) アルゴリズムとして記述されます。 これに対し、要素の数が増えるに従って、所要時間の増加が次第に少なくなる操作は、O(log n) アルゴリズムとして記述されます。 したがって、パフォーマンスの観点から、O(log n) アルゴリズムは、要素の数が増えるにつれて、O(n) アルゴリズムよりもますますパフォーマンスが高くなります。
コレクションの形状と特徴
図形 | 発行済 | インデックス付き | 挿入 要素 |
検索対象 指定された要素 |
複製 要素 |
---|---|---|---|---|---|
一覧取得 | はい | いいえ | 高速 (一定時間) | 低速 O(n) | はい |
Array | はい | int (定数時間) | 末尾に挿入する場合 (この場合は定数時間) を除き低速 O(n) | 低速 O(n) | はい |
マップ | いいえ | キー (一定時間) | 高速 (一定時間) | 高速 (一定時間) | いいえ (キー)、はい (値) |
Red-Black マップ | はい (キー) | キー O(log n) | 高速 O(log n) | 高速 O(log n) | いいえ |
Red-Black Multimap | はい (キー) | キー O(log n) (キーごとに複数の値) | 高速 O(log n) | 高速 O(log n) | はい (キーごとに複数の値) |
CTraits オブジェクトの使用
ATL コレクション クラスを使用すれば、さまざまなユーザー定義データ型を格納することができるので、比較などの重要な関数をオーバーライドできると便利な場合があります。 これは CTraits クラスを使用して実現されます。
CTraits クラスは、MFC コレクション クラスのヘルパー関数と似ていますが、柔軟の上ではより優れています。詳細については、「コレクション クラスのヘルパー」を参照してください。
コレクション クラスを構築するときには、CTraits クラスを指定するオプションを使用できます。 このクラスには、コレクション クラスを構成する他のメソッドによって呼び出された場合に、比較などの操作を実行するコードが含まれます。 たとえば、ご利用のリスト オブジェクトに独自のユーザー定義構造体が含まれている場合は、特定のメンバー変数の比較のみを行うために等値テストを再定義できます。 この方法では、リスト オブジェクトの Find メソッドは、より便利な方法で動作します。
例
コード
// Collection class / traits class example.
// This program demonstrates using a CTraits class
// to create a new comparison operator.
#define MAX_STRING 80
// Define our own data type to store in the list.
struct MyData
{
int ID;
TCHAR name[MAX_STRING];
TCHAR address[MAX_STRING];
};
// Define our own traits class, making use of the
// existing traits and overriding only the comparison
// we need.
class MyTraits : public CElementTraits< MyData >
{
public:
// Override the comparison to only compare
// the ID value.
static bool CompareElements(const MyData& element1, const MyData& element2)
{
if (element1.ID == element2.ID)
return true;
else
return false;
};
};
void DoAtlCustomTraitsList()
{
// Declare the array, with our data type and traits class
CAtlList < MyData, MyTraits > MyList;
// Create some variables of our data type
MyData add_item, search_item;
// Add some elements to the list.
add_item.ID = 1;
_stprintf_s(add_item.name, _T("Rumpelstiltskin"));
_stprintf_s(add_item.address, _T("One Grimm Way"));
MyList.AddHead(add_item);
add_item.ID = 2;
_stprintf_s(add_item.name, _T("Rapunzel"));
_stprintf_s(add_item.address, _T("One Grimm Way"));
MyList.AddHead(add_item);
add_item.ID = 3;
_stprintf_s(add_item.name, _T("Cinderella"));
_stprintf_s(add_item.address, _T("Two Grimm Way"));
MyList.AddHead(add_item);
// Create an element which will be used
// to search the list for a match.
search_item.ID = 2;
_stprintf_s(search_item.name, _T("Don't care"));
_stprintf_s(search_item.address, _T("Don't care"));
// Perform a comparison by searching for a match
// between any element in the list, and our
// search item. This operation will use the
// (overridden) comparison operator and will
// find a match when the IDs are the same.
POSITION i;
i = MyList.Find(search_item);
if (i != NULL)
_tprintf_s(_T("Item found!\n"));
else
_tprintf_s(_T("Item not found.\n"));
}
Comments
CTraits クラスの一覧については、「コレクション クラス」を参照してください。
次の図は、CTraits クラスのクラス階層を示しています。
コレクション クラスのサンプル
次のサンプルは、コレクション クラスを示しています。