バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.


RWTPtrSortedVector<T>

形式

#include <rw/tpsrtvec.h>
RWTPtrSortedVector<T> sortvec;

注 - 標準 C++ ライブラリがない場合は、ここで説明しているインタフェースを使用してください。標準 C++ ライブラリがある場合は、クラスリファレンスの説明にあるインタフェースを使用してください。

説明

このクラスは、ポインタにもとづく順序付きコレクションです。つまり、コレクション内の項目は相互に意味のある順序を保ち、インデックス番号でアクセスできます。オブジェクトは、自分より小さいオブジェクトと自分より大きいオブジェクトとの間に挿入されます (挿入ソート)。項目の重複は許可されています。

不等号 (<) 演算子によって決められた順序に従って、挿入する項目へのポインタをコレクションに格納します。

クラス T には次のものが必要です。

RWTPtrSortedVector<T> 内でポインタが参照するオブジェクトを変更することは可能ですが、危険です。これは、その変更が operator<()operator==() の動作に影響し、RWTPtrSortedVector<T> をソートされていない状態にするからです。

持続性

同形

次の例では、任意の順序で日付のセットをソート済みベクトルに挿入して日付を順番に出力します。

#include <rw/tpsrtvec.h>
#include <rw/rwdate.h>
#include <rw/rstream.h>

main()  {
  RWTPtrSortedVector<RWDate> vec;

  vec.insert(new RWDate(10, "Aug", 1991));
  vec.insert(new RWDate(9, "Aug", 1991));
  vec.insert(new RWDate(1, "Sep", 1991));
  vec.insert(new RWDate(14, "May", 1990));
  vec.insert(new RWDate(1, "Sep", 1991));  // 重複して追加する
  vec.insert(new RWDate(2, "June", 1991));

  for (int i=0; i<vec.length(); i++)
    cout << *vec[i] << endl;

  vec.clearAndDestroy();

  return 0;
}

プログラム出力:

May 14, 1990
June 2, 1991
August 9, 1991
August 10, 1991
September 1, 1991
September 1, 1991

公開コンストラクタ

RWTPtrSortedVector(size_t capac = RWDEFAULT_CAPACITY);

初期容量が capac の、空のソート済みベクトルを作成します。項目数がこの容量を超えると、ベクトルは自動的にサイズ変更されます。

RWTPtrSortedVector<T>(const RWTPtrSortedVector<T>& c);

新しい順序付けられたベクトルを c のシャローコピーとして作成します。作成後、ポインタは 2 つのコレクション間で共有されます。

公開演算子

RWTPtrSortedVector<T>&
operator=(const RWTPtrSortedVector& c);

自分自身に c のシャローコピーを設定します。設定後、ポインタは 2 つのコレクション間で共有されます。

T*&
operator()(size_t i);
T* const&
operator()(size_t i) const;

ベクトル内の i 番目の値へのポインタを返します。最初に記述した可変要素は左辺値として使用できますが、2 番目に記述したものは使用できません。インデックス i は 0 〜 (コレクション内の項目数 -1) の範囲になければなりません。境界検査は行いません。左辺値として使用するときは、コレクションのソート状態に影響しないように注意してください。

T*&
operator[](size_t i);
T* const&
operator[](size_t i) const;

ベクトル内の i 番目の値へのポインタを返します。最初に記述した可変要素は左辺値として使用できますが、2 番目に記述したものは使用できません。インデックス i は 0 〜 (コレクション内の項目数 -1) の範囲になければなりません。範囲外にあると RWBoundsError 型の例外が発生します。左辺値として使用するときは、コレクションのソート状態に影響しないように注意してください。

公開メンバー関数

T*&
at(size_t i);
T* const&
at(size_t i) const;

ベクトル内の i 番目の値へのポインタを返します。最初に記述した可変要素は左辺値として使用できますが、2 番目に記述したものは使用できません。インデックス i は 0 〜 (コレクション内の項目数 -1) の範囲になければなりません。範囲外にあると RWBoundsError 型の例外が発生します。左辺値として使用するときは、コレクションのソート状態に影響しないように注意してください。

void
clear();

コレクションからすべての項目を取り除きます。

void
clearAndDestroy();

コレクションからすべての項目を取り除き、それぞれのデストラクタを削除します。

RWBoolean
contains(const T* a) const;

オブジェクト a と等しい項目がコレクションにあれば TRUE を、なければ FALSE を返します。2 等分探索を行います。等しいかどうかは、型 T に対するクラス定義の等価演算子で判定します。

T* const *
data() const;

ベクトルの生データへのポインタを返します。ベクトルの内容は変えてはなりません。この関数の使用には注意を要します。

size_t
entries() const;

現在、コレクションにある項目の数を返します。

T*
find(const T* target) const;

オブジェクト target と等しい最初のオブジェクトへのポインタを返します。等しいオブジェクトがなければ NULL を返します。2 等分探索を行います。等しいかどうかは、型 T に対するクラス定義の等価演算子で判定します。

T* const&
first() const;

ベクトル内の最初の項目へのポインタを返します。ベクトルが空であると RWBoundsError 型の例外が発生します。

size_t
index(const T* a) const;

2 分探索を行い、オブジェクト a と等しい最初のオブジェクトのインデックスを返します。等しいオブジェクトがなければ RW_NPOS を返します。等しいかどうかは、型 T に対するクラス定義の等価演算子で判定します。

void
insert(T* a);

2 分探索を行います。次に、オブジェクト a を、それより小さいか等しいオブジェクトの後で、かつ、それより大きいオブジェクトの前に挿入します。"それより小さいかどうか" は、型 T に対するクラス定義 `<` 演算子で判定します。追加の結果、項目数が容量を超えるときは、コレクションのサイズは自動的に変わります。

RWBoolean
isEmpty() const;

コレクション内に項目がまったくなければ TRUE を、あれば FALSE を返します。

T* const&
last() const;

コレクション内の最後の項目へのポインタを返します。コレクションが空であると RWBoundsError 型の例外が発生します。

size_t
length() const;

コレクション内の現在の項目数を返します。

size_t
occurrencesOf(const T* a) const;

2 分探索を行い、オブジェクト a と等しいオブジェクトの数を返します。等しいかどうかは、型 T に対するクラス定義の等価演算子で判定します。

T*
remove(const T* a);

2 分探索を行い、オブジェクト a と等しい最初のオブジェクトを取り除き、そのオブジェクトへのポインタを返します。等しいオブジェクトがなければ NULL を返します。等しいかどうかは、型 T に対するクラス定義の等価演算子で判定します。

size_t
removeAll(const T* a);

2 分探索を行い、オブジェクト a と等しいすべてのオブジェクトを取り除き、その数を返します。等しいかどうかは、型 T に対するクラス定義の等価演算子で判定します。

T*
removeAt(size_t i);

インデックス i のオブジェクトを取り除き、それへのポインタを返します。i が無効なインデックスであれば RWBoundsError 型の例外が発生します。有効なインデックスの範囲は 0 〜 (リスト内の項目数 -1) です。

T*
removeFirst();

コレクション内の最初の項目を取り除き、それへのポインタを返します。リストが空であると RWBoundsError 型の例外が発生します。

T*
removeLast();

コレクション内の最後の項目を取り除き、それへのポインタを返します。リストが空であると RWBoundsError 型の例外が発生します。

void
resize(size_t N);

コレクションの容量を N に変更します。コレクション内のオブジェクト数は変えず、容量だけを変えます。

関連の大域演算子

RWvostream&
operator<<(RWvostream& strm,
       const RWTPtrSortedVector<T>& coll);
RWFile&
operator<<(RWFile& strm, const RWTPtrSortedVector<T>& coll);

出力ストリーム strm にコレクション coll を保存するか、すでに保存されている場合は、そのコレクションに対する参照を保存します。

RWvistream&
operator>>(RWvistream& strm, RWTPtrSortedVector<T>& coll);
RWFile&
operator>>(RWFile& strm, RWTPtrSortedVector<T>& coll);

コレクション coll の内容を入力ストリーム strm から復元します。

RWvistream&
operator>>(RWvistream& strm, RWTPtrSortedVector<T>*& p);
RWFile&
operator>>(RWFile& strm, RWTPtrSortedVector<T>*& p);

入力ストリーム strm 上の次のオブジェクトを調べて、ヒープから新しいコレクションを作成してそれを指すように p を設定するか、または前に読み込んだインスタンスを指すように p を設定します。コレクションをヒープから作成した場合、ユーザーはそれを削除する責任があります。