ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
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には相当する機能がないため、同等のことをするにはビット演算を用いることになる。
上の例を似たように扱うため、例えば次のような列挙型を定義するとする。
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++でも上と同等の記述は可能だが、Fuga = 0;はエラーになるので注意。次のように書かねばならない。
Fuga = static_cast<Hoge>(0);
これ以上を望むなら、素直に集合型のclassを作った方がよいだろう。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます