 
 
 
 
 
 
 
  
 
 は、
は、 へのポインターの配列である。
 へのポインターの配列である。
 クラスの子孫であれば、
何でもつめることができる。
要素要素で別のクラスであっても良い。
 クラスの子孫であれば、
何でもつめることができる。
要素要素で別のクラスであっても良い。
 自体、
 自体、 の子孫なので、
配列要素になれる。
したがって、複雑なネスト構造がつくれる。
 の子孫なので、
配列要素になれる。
したがって、複雑なネスト構造がつくれる。
 は、
 は、 、
、
 、
、
 、
、 、
、
 などの仲間で、
Collection とか Container とか呼ばれている。
 などの仲間で、
Collection とか Container とか呼ばれている。
 
普通の配列でなく、
 を使う利点はいろいろある。
配列に要素を加えていく(
 を使う利点はいろいろある。
配列に要素を加えていく( メソッドを使う)際に、
配列が小さければ自動的に拡張してくれる。
また、
 メソッドを使う)際に、
配列が小さければ自動的に拡張してくれる。
また、 メソッドで、要素を削除したり、
削除後空いたところを
 メソッドで、要素を削除したり、
削除後空いたところを 
 したりできる。
配列要素を一括して
 したりできる。
配列要素を一括して  できる
(
 できる
( メソッドを使う)。
 メソッドを使う)。
 、
、 または
 または ![${\tt [~]}$](img167.gif) 、
など配列要素にアクセスする標準的なインターフェースが提供されている。
要素の並べ代えも簡単にできる。
、
など配列要素にアクセスする標準的なインターフェースが提供されている。
要素の並べ代えも簡単にできる。
使い方は、
  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" をプリント(怒られない)
配列の拡張は時間がかかるので、
普通は最初に十分な大きさの領域を確保する。
また、決まった大きさの要素の配列に対しては、
 を使うのが経済的である。
さらに使い方を学ぶには
 を使うのが経済的である。
さらに使い方を学ぶには
$ROOTSYS/test/tcollex.cxxが非常に参考になる。
 
 
 
 
 
 
