ATL コレクション クラス
更新 : 2007 年 11 月
ATL には、データを格納およびアクセスするための多くのクラスが用意されています。どのクラスを使用するかは、以下の複数の要因に基づいて決定します。
格納するデータ量
データのアクセスの効率とパフォーマンス
インデックスまたはキーでデータにアクセスする機能
データの順序付けの方法
ユーザーの好み
小さなコレクション クラス
ATL には、少数のオブジェクトを扱う以下の配列クラスが用意されています。ただし、これらのクラスは ATL での内部的な使用に限定され、デザインされています。プログラムでは使用しないことをお勧めします。
クラス |
データ ストレージの種類 |
---|---|
少数のオブジェクトを扱う配列クラスを実装します。 |
|
少数のオブジェクトを扱うマップ クラスを実装します。 |
汎用コレクション クラス
以下のクラスは、配列、リスト、およびマップを実装する汎用コレクション クラスとして用意されています。
クラス |
データ ストレージの種類 |
---|---|
配列を実装します。 |
|
リストを実装します。 |
|
データをキーまたは値で参照できるマップ構造体を実装します。 |
|
レッドブラック アルゴリズムを使用してマップ構造体を実装します。 |
|
レッドブラック マルチ マップ構造体を実装します。 |
これらのクラスは、デバッグ ビルドで使用されるときには多くのプログラミング エラーをトラップしますが、パフォーマンス上の理由から、これらのチェックはリリース ビルドでは実行されません。
特殊なコレクション クラス
メモリ ポインタとインターフェイス ポインタの管理用に、さらに特殊なコレクション クラスも用意されています。
クラス |
目的 |
---|---|
スマート ポインタの配列を構築するときに役立つメソッドを提供します。 |
|
スマート ポインタのリストを構築するときに役立つメソッドを提供します。 |
|
IUnknown ポインタを格納します。IConnectionPointImpl テンプレート クラスのパラメータとして使用されるようにデザインされています。 |
|
ヒープ ポインタのリストを構築するときに役立つメソッドを提供します。 |
|
COM インターフェイス ポインタの配列を構築するときに役立つメソッドを提供します。 |
|
COM インターフェイス ポインタのリストを構築するときに役立つメソッドを提供します。 |
コレクション クラスの選択
使用できる各コレクション クラスは、下の表に示すようにパフォーマンス特性が異なります。
2 列目と 3 列目は、各クラスの順序付けとアクセス方法の違いです。"順序付け" とは、要素を挿入または削除した順によってコレクション内の要素の位置が決まることです。要素を内容別に並べ替えることはできません。"インデックス付き" の場合は、コレクション内の要素を整数インデックスによって取り出すことができます。通常の配列では項目にインデックスが付いています。
4 列目と 5 列目は、各クラスのパフォーマンスです。頻繁にコレクションに要素を挿入するアプリケーションでは、要素の挿入スピードが特に重要です。ほかのアプリケーションでは、検索スピードがより重要です。
6 列目は、要素を重複できるかどうかです。
特定のコレクション クラス操作のパフォーマンスは、操作の完了に必要な時間とコレクション内の要素数との関係で表現されます。要素数が増えるにつれて時間量が線形に増加する操作は、O(n) アルゴリズムとして説明されます。対照的に、要素数が増えるにつれて時間の増加が少しずつ減少する操作は、O(log n) アルゴリズムとして説明されます。したがって、パフォーマンスに関しては、要素数が増えるほど O(log n) アルゴリズムの方が O(n) アルゴリズムよりも効率が良くなります。
コレクションの形状とその特徴
形状 |
順序付き |
インデックス付き |
挿入 element |
[検索対象] 指定された要素 |
重複 要素かどうか |
---|---|---|---|---|---|
リスト |
○ |
× |
高速 (定数時間) |
低速 O(n) |
○ |
配列 |
○ |
整数による (定数時間) |
低速 最後に挿入する場合を除き O(n)。最後に挿入する場合は定数時間 |
低速 O(n) |
○ |
マップ |
× |
キーによる (定数時間) |
高速 (定数時間) |
高速 (定数時間) |
× (同じキーは不可) ○ (同じ値でも可) |
レッドブラック マップ |
○ (キー) |
キーによる O(log n) |
高速 O(log n) |
高速 O(log n) |
× |
レッドブラック マルチマップ |
○ (キー) |
キーによる 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"));
}
説明
CTraits クラスの一覧については、「コレクション クラス」を参照してください。
CTraits クラスのクラス階層を次の図に示します。
コレクション クラスのサンプル
コレクション クラスのサンプルは、次のとおりです。