集合型
読み:しゅうごうがた
論理型を集めて扱うようなデータ型のこと。構造化型の一つ。
概要
Delphiを含むPascalで使われている特徴的な型である。
C、C++、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を作った方がよいだろう。
再検索