next up previous contents
: プログラム中でインタープリターを使う : 使ってみよう、便利なクラス : TString と TObjString   目次

コンテナクラス

${\tt TObjArray}$は、${\tt TObject}$ へのポインターの配列である。 ${\tt TObject}$ クラスの子孫であれば、 何でもつめることができる。 要素要素で別のクラスであっても良い。 ${\tt TObjArray}$ 自体、${\tt TObject}$ の子孫なので、 配列要素になれる。 したがって、複雑なネスト構造がつくれる。 ${\tt TObjArray}$ は、${\tt TList}$ ${\tt THashList}$ ${\tt TClonesArray}$${\tt TBtree}$ ${\tt TSortedList}$ などの仲間で、 Collection とか Container とか呼ばれている。

普通の配列でなく、 ${\tt TObjArray}$ を使う利点はいろいろある。 配列に要素を加えていく(${\tt Add}$ メソッドを使う)際に、 配列が小さければ自動的に拡張してくれる。 また、${\tt Remove}$ メソッドで、要素を削除したり、 削除後空いたところを ${\tt Compress}$ したりできる。 配列要素を一括して ${\tt delete}$ できる (${\tt Delete}$ メソッドを使う)。 ${\tt TIter}$${\tt At(~)}$ または ${\tt [~]}$、 など配列要素にアクセスする標準的なインターフェースが提供されている。 要素の並べ代えも簡単にできる。

使い方は、


  TObjString os1("hoge");
  TObjString os2("hogehoge");
  TObjString os3("owari");
  TObjArray  oa(1);                     // 大きさ 1 の配列を作成
  oa.Add(os1);                          // 配列に os1 を入れる
  oa.Add(os2);                          // 配列に os2 を追加
  oa.Add(os3);                          // 配列に os3 を追加
  TObjString *sp = (TObjString *)oa[0]; // s1 を取得(cast が必要)
  oa.Remove(s2);                        // s2 を削除
  TIter next(oa);                       // iterator の作成
  while((sp = (TObjString *)next())) {  // cast が必要
     cout << sp << endl;                // s2 はプリントされない
  }
  cout << oa[1] << endl;                // oa[1] はいない(怒られる)
  oa.Compress();                        // 圧縮
  cout << oa[1] << endl;                // "owari" をプリント(怒られない)
配列の拡張は時間がかかるので、 普通は最初に十分な大きさの領域を確保する。 また、決まった大きさの要素の配列に対しては、 ${\tt TClonesArray}$ を使うのが経済的である。 さらに使い方を学ぶには

  $ROOTSYS/test/tcollex.cxx
が非常に参考になる。


next up previous contents
: プログラム中でインタープリターを使う : 使ってみよう、便利なクラス : TString と TObjString   目次
Keisuke Fujii 平成12年12月22日