データ構造における異種配列の実現方法
配列は定義上、同種(同一データ型)の要素のみを格納できるデータ構造です。そのため、通常は同じ型のデータをまとめて扱うことになります。しかし、異なる型のデータをひとつの配列に格納したい場合はどうすればよいのでしょうか。本記事では、そのための代表的なテクニックを2つ紹介します。
C言語におけるunion(共用体)を活用した方法
C言語のような古典的な言語では、union(共用体)を使って複数の型を人工的にひとつの型へとまとめる手法が用いられます。この新しい型に対して配列を定義すれば、見かけ上は異種のデータを同じ配列で管理できます。実際に配列の各要素がどのオブジェクトを保持しているかは、「タグ」と呼ばれる識別子によって判定します。
例えば、次のような構造体を考えてみましょう。
struct Vehicle{
int id;
union {
Bus b;
Bike c;
Car d;
}
};
この場合、プログラマーはidタグの使い方についてあらかじめ規約を決めておく必要があります。例えば「idが0のときは、そのVehicleが表すのはBusである」といった具合です。なお、unionはBus・Bike・Carの中で最もサイズの大きい型に合わせてメモリを確保するため、各オブジェクトのサイズ差が大きい場合にはメモリが無駄になるという欠点があります。
オブジェクト指向言語における継承を活用した方法
一方、オブジェクト指向言語では継承(インヘリタンス)の概念を利用できます。例えばVehicleという基底クラスを用意し、Bus・Bike・Carなどをそのサブクラスとして定義します。すると、Vehicle型の配列を定義すれば、そのすべてのサブクラスのオブジェクトも同じ配列に格納できるようになります。
このアプローチなら、タグによる手動の判別が不要になり、ポリモーフィズムによって各オブジェクトの振る舞いも自然に扱えるため、より安全で拡張性の高い設計が可能になります。これにより、複数の型のデータをひとつの配列で効率的に管理できるのです。
-
データ構造入門:不規則な配列(ジャグ配列)とは?正規配列との違いを解説
不規則な配列(Irregular Arrays)とはこの記事では、データ構造における「不規則な配列」について解説します。不規則な配列を理解するためには、まず「正規の配列(Regular Arrays)」について知っておく必要があります。正規の配列とは正規の配列とは、各行に含まれる列の数がすべて同じであるような配列のことです。言い換えれば、どの行も同じ数の要素を持っている場合、その配列は正規の配列と呼ばれます。以下のような2次元配列が、正規の配列の典型的な例です。このように、行ごとの要素数が一定であるため、メモリ上でも連続した領域として扱いやすく、インデックスによるアクセスが単純になるという特徴
-
データ構造入門:多次元配列を表す「配列の配列」とは?仕組みと実装方法を解説
多次元配列のもう一つの表現方法:「配列の配列」 データ構造において、多次元配列を扱う方法はいくつか存在します。本記事では、その中でも「配列の配列(Array of Arrays)」と呼ばれる表現方法について詳しく解説します。 この形式では、1つの親となる配列が、複数の配列それぞれの先頭アドレスを保持するという構造になっています。イメージとしては以下のようになります。 配列の配列の構造 上図は、サイズ [7 × 8] の2次元配列 x を表しています。この構造では、各行が独立した1次元配列として扱われ、最初の配列(親配列)がこれらの個々の配列へのアドレスを格納しています。 つまり、親配列の中身