集合型
読み:しゅうごうがた

 論理型を集めて扱うようなデータ型のこと。構造化型の一つ。
目次

概要
 Delphiを含むPascalで使われている特徴的な型である。
 CC++C#などには、相当するものがない。

特徴

Delphi
 0以上の要素を持つ型として使われる。
 例えば、次のように定義する。
 type Hoge = set of (A, B, C, D, E, F);
 var Fuga: Hoge;
 実際の使用例は次の通り。
 Fuga := []; // 空集合
 Fuga := [B, E]; // BとE
 計算も可能である。
 Fuga := Fuga - [E]; // Eを抜く
 Fuga := [A, B, C] + [C, D]; // 結果、Fugaは[A, B, C, D]
 if文で、要素が含まれるかどうかの判別処理も書くことができる。
 if (B in Fuga) then ...;
 集合型に使える演算子(集合演算子)は、次のものがある。

C
 Cには相当する機能がないため、同等のことをするにはビット演算を用いることになる。
 上の例を似たように扱うため、例えば次のような列挙型を定義するとする。
 typedef enum { A = 1, B = 2, C = 4, D = 8, E = 16, F = 32 } Hoge;
 Hoge Fuga;
 この時、次のようにできる。
 Fuga = 0; // 空集合
 Fuga = B | E; // BとE
 計算はビット演算で代用する。
 Fuga &= ~E; // Fuga := Fuga - [E];
 Fuga = (A | B | C) | (C | D); // Fuga := [A, B, C] + [C, D];
 if文で、要素が含まれるかどうかの判別処理は、次のようにする。
 if (Fuga & B) { ... };
 処理は不可能ではなく、現実にCでこのように書かれた処理系は数多存在するが、これを「集合型」と呼ぶことはない。

C++
 C++でも上と同等の記述は可能だが、Fuga = 0;はエラーになるので注意。次のように書かねばならない。
 Fuga = static_cast<Hoge>(0);
 これ以上を望むなら、素直に集合型のclassを作った方がよいだろう。

再検索