コンテナ (データ型)
コンピュータプログラミングにおいて、コンテナ(英: container)とはオブジェクトの集まりを表現するデータ構造、抽象データ型またはクラスの総称である。コレクション(英: collection)とも言う。コンテナには複数の種類があり、それぞれ独自の方法でオブジェクトを組織的に格納する。
よく知られたものには、
などがある。
同じ分類のコンテナであっても、実装形態の違いから、各種操作の計算量(計算時間)やメモリ上に占める空間的特性などが異なるものがある。例えばリストには主に動的配列によるリストと連結リストがあり、それぞれ場面によって向き不向きがある。
コンテナクラスは一般的に以下のような操作を実装している。
- 新しい空のコンテナを作成する
- 格納しているオブジェクト(要素)の数を得る
- すべての要素を取り除く(空にする)
- 新しい要素を格納する
- 特定の要素を取り除く
- 格納している要素へのアクセス手段を提供する
ジェネリックプログラミングをサポートする言語や、動的型付け言語では、一般的にコンテナの要素にはどのようなデータ型のオブジェクトも取ることができるが、言語によっては要素の型が満たすべき要件が制約として課されていることもある[1]。この要件を満たせば、他のコンテナ型を要素に取るコンテナを定義することもできる。またコンテナのサイズは要素数に合わせて自動的に変化する。
コンテナがオブジェクトを格納する方法には2種類ある。値によるものと参照によるものである。
- 値によるコンテナ
- オブジェクトのコピーを格納する。要素へのアクセスはそのコピーを返す。あるオブジェクトをコンテナに格納した(このときコピーされる)後で外部で変更を加えても、コンテナの中身には影響しない。
- 参照によるコンテナ
- オブジェクトへの参照やポインタのみを格納する。要素へのアクセスはその参照を返す。あるオブジェクトをコンテナに格納した後で外部で変更を加えると、コンテナの中身(その要素)が変更される。弱い参照によってガベージコレクションを考慮するものもある。
Javaのコレクション・フレームワークやC++のSTLなどで、多くの汎用コンテナが実装されている。なお、Javaの場合はジェネリクスは型消去によって実現されている[2]ことから、型パラメータにint
のようなプリミティブ型を指定することはできず[3]、java.lang.Object
から派生する参照型のみが許可される。そのため配列以外の汎用コレクションにプリミティブ型を直接格納することはできず、必ずjava.lang.Integer
のようなプリミティブラッパークラスを使う必要がある。.NETのジェネリクスではこの点が改善されており、汎用コレクションの要素に値型・参照型を問わず任意の型を指定できる。