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

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


RWTPtrHashSet<T,H,EQ>

形式

#include <rw/tphset.h>
RWTPtrHashSet<T,H,EQ> s;

注 - 標準 C++ ライブラリがある場合は、ここで述べるインタフェースを使用します。標準 C++ ライブラリがない場合は、付録 A に記載する RWTPtrHashSet に制限されたインタフェースを使用してください。

説明

このクラスは、型 H のハッシュオブジェクトに従って格納される、ポインタにもとづく値のコレクションを維持します。クラス T はコレクションの項目が指す型です。H は、次の公開メンバーを介して、型 T の要素に対するハッシュ機能を提供しなければなりません。

  unsigned long operator()(const T& x)
コレクション中のオブジェクトは、型 EQ の同等オブジェクトにもとづいてグループ化されます。EQ は、次の公開メンバーを介して、このグループ化を保証しなければなりません。

  bool operator()(const T& x, const T& y)
これは、xy が等しい場合に TRUE を返し、それ以外の場合は FALSE を返します。

RWTPtrHashSet<T,H,EQ> は、コレクション内の既存の項目と等しい項目は受け付けません (RWTPtrHashMultiSet<T,H,EQ> には、互いに等しい複数の項目を含めることができます)。等しいかどうかは、== 演算子ではなく、同等オブジェクトにもとづいて判定されます。

持続性

同形

//
// tphset2.cpp
//
#include <rw/tphset.h>
#include <rw/cstring.h>
#include <iostream.h>

struct silly_hash{
   unsigned long operator()(RWCString x) const
   { return x.length() * (long)x(0); }
};

main(){
RWTPtrHashSet<RWCString,silly_hash,equal_to<RWCString> > set1;
RWTPtrHashSet<RWCString,silly_hash,equal_to<RWCString> > set2;

 set1.insert(new RWCString("one"));
 set1.insert(new RWCString("two"));
 set1.insert(new RWCString("three"));
 set1.insert(new RWCString("one")); // 二重挿入が拒絶された

 cout << set1.entries() << endl;   // 「3」を出力する

 set2 = set1;
 cout << ((set1.isEquivalent(set2)) ? "TRUE" : "FALSE") << endl;
 // 「TRUE」を出力する

 set2.difference(set1);

 set1.clearAndDestroy();
 cout << set1.entries() << endl;    // 「0」を出力する
 cout << set2.entries() << endl;    // 「0」を出力する

 return 0;
}

関連クラス

クラス RWTPtrHashMultiSet<T,H,EQ> は、は、互いに等しい複数の項目を受け付けるポインタにもとづくコレクションに対して同じインタフェースを提供します。

クラス rw_hashset<T*,rw_deref_hash<H,T>, rw_deref_compare<EQ,T>> は、RWTPtrHashSet<T,H,EQ> の基礎となる実装として使用される C++ 標準コレクションです。

公開 Typedef

typedef rw_deref_compare<EQ,T>                 container_eq;
typedef rw_deref_hash<H,T>                     container_hash;
typedef rw_hashset<T*,container_hash, container_eq>
                                               container_type;
typedef container_type::size_type              size_type;
typedef container_type::difference_type        difference_type;
typedef container_type::iterator               iterator;
typedef container_type::const_iterator         const_iterator;
typedef T*                                     value_type;
typedef T* const&                              reference;
typedef T* const&                              const_reference;

公開コンストラクタ

RWTPtrHashSet<T,H,EQ>
(size_type sz=1024,const H& h = H(),const EQ& eq = EQ());

空のハッシュセットを作成します。基礎となるハッシュテーブル表現は、sz バケットを持ち、h をハッシング関数として使用し、eq を要素間の等価性をテストするのに使用します。

RWTPtrHashSet<T,H,EQ>(const RWTPtrHashSet<T,H,EQ>& rws);

コンストラクタをコピーします。

RWTPtrHashSet<T,H,EQ>
(const H& h,size_type sz = RWDEFAULT_CAPACITY);

この Tools.h++ 6.x スタイルのコンストラクタは、ハッシュオブジェクト h を使用し、初期ハッシュテーブル容量 sz を持つ空のハッシュセットを作成します。

RWTPtrHashSet<T,H,EQ>
(const rw_hashset<T*,container_hash,container_eq>& s);

s からすべての要素をコピーすることによって、ポインタにもとづくハッシュセットを作成します。

RWTPtrHashSet<T,H,EQ>(T*const* first,T*const* last,
size_type sz=1024,const H& h = H(),const EQ& eq = EQ());

first が指す T* の配列から last が指す要素まで (ただし、その要素は含みません)、要素をコピーすることによって、セットを作成します。基礎となるハッシュテーブル表現は、sz バケットを持ち、h をハッシング関数として使用し、eq を要素間の等価性をテストするのに使用します。

公開メンバー演算子

RWTPtrHashSet<T,H,EQ>&
operator=(const RWTPtrHashSet<T,H,EQ>& s);

自分自身のすべての要素を消去し、s のすべての要素をコピーすることによって、それらを置き換えます。

bool
operator==(const RWTPtrHashSet<T,H,EQ>& s) const;

自分自身が s と等しい場合は TRUE を返し、それ以外の場合は FALSE を返します。2 つのコレクションのエントリ数が同じで、両方のコレクションを反復したときに個々の要素が互いに等しい場合、両者は等しいと言えます。要素は比較前に間接参照されます。

公開メンバー関数

void
apply(void (*fn)(const T*,void*), void* d) const;

fn が指すユーザー定義関数を、コレクション内の各項目に適用します。fn 関数は、次のプロトタイプを持っていなければなりません。

void
yourfun(const T* a, void* d);

クライアントデータは、パラメタ d を通して渡すことができます。

iterator
begin();
const_iterator
begin() const;

自分自身内の最初の要素の位置にある反復子を返します。

size_type
capacity() const;

基礎となるハッシュ表現で使用可能なバケット (スロット) 数を返します。下記の resize を参照してください。

void
clear();

自分自身から項目をすべて削除することによって、コレクションを消去します。

void
clearAndDestroy();

コレクションからすべての項目を削除し、operator delete を使用して、これらの項目が指すオブジェクトを破棄します。同じオブジェクトに対して複数のポインタが格納される場合は、自分自身メソッドを使用しないでください (等値演算子が再帰的な場合には、コンテナはそのような複数ポインタを保持できません)。

bool
contains(const T* a) const;

自分自身内に式 (*t == *a)TRUE になるような要素 t が存在する場合は TRUE を返し、それ以外の場合は FALSE を返します。

bool
contains(bool (*fn)(const T*,void*), void* d) const;

自分自身内に式 ((*fn)(t,d))TRUE になるような要素 t が存在する場合は、TRUE を返します。それ以外の場合は、FALSE を返します。fn が指すユーザー定義テスター関数は、次のプロトタイプを持っていなければなりません。

bool
yourTester(const T*,void*), void* d) const;

クライアントデータは、パラメタ d を通して渡すことができます。

void
difference(const RWTPtrHashSet<T,H,EQ>& s);

(self - s) を使用して、自分自身に差集合を設定します。各集合からの要素は、比較前に間接参照されます。

iterator
end();
const_iterator
end() const;

自分自身内の最後の要素の「直後」にある反復子を返します。

size_type
entries() const;
自分自身内の項目数を返します。

float
fillRatio() const;

entries()/capacity() の比率を返します。

const T*
find(const T* a) const;

自分自身内に *t*a に等しくなるような要素 t が存在する場合は、t を返します。それ以外の場合は、rwnil を返します。

const T*
find(bool (*fn)(const T*,void*), void* d) const;

自分自身内に式 ((*fn)(t,d))TRUE になるような要素 t が存在する場合は、t を返します。それ以外の場合は、rwnil を返します。fn が指すユーザー定義テスター関数は、次のプロトタイプを持っていなければなりません。

   bool yourTester(const T* a, void* d);

クライアントデータは、パラメタ d を通して渡すことができます。

bool
insert(T* a);

項目 a をコレクションに追加します。挿入が正常に行われた場合は TRUE を返し、それ以外の場合は FALSE を返します。コレクションが同値キーを持つ要素を持たない限り、この関数は TRUE を返します。

void
intersection(const RWTPtrHashSet<T,H,EQ>& s);

自分自身と s に対して、自分自身を破壊して積集合を計算し、自分自身の内容を結果に置き換えます。

bool
isEmpty() const;

コレクション内に項目が存在しない場合は TRUE を返し、それ以外の場合は FALSE を返します。

bool
isEquivalent(const RWTPtrHashSet<T,H,EQ>& s) const;

自分自身と s が集合的に等しい場合は TRUE を返し、それ以外の場合は FALSE を返します。

bool
isProperSubsetOf(const RWTPtrHashSet<T,H,EQ>& s) const;

自分自身が s の真部分集合の場合は TRUE を返し、それ以外の場合は FALSE を返します。

bool
isSubsetOf(const RWTPtrHashSet<T,H,EQ>& s) const;

自分自身が s の部分集合である場合、あるいは自分自身が s と集合的に等しい場合は TRUE を返し、それ以外の場合は FALSE を返します。

size_type
occurrencesOf(const T* a) const;

*a と等しい要素 t の数を返します。

size_type
occurrencesOf(bool (*fn)(const T*,void*), void* d) const;

((*fn)(t,d))TRUE になるような自分自身内の要素 t の数を返します。fn が指すユーザー定義テスター関数は、次のプロトタイプを持っていなければなりません。

   bool yourTester(const T* a, void* d);

クライアントデータは、パラメタ d を通して渡すことができます。

T*
remove(const T* a);

*a と等しい自分自身内の最初の要素を削除して返します。そのような要素が存在しない場合は、rwnil を返します。

T*
remove(bool (*fn)(const T*,void*), void* d);

((*fn)(t,d))TRUE になるような自分自身内の最初の要素 t を削除して返します。そのような要素が存在しない場合は、rwnil を返します。fn が指すユーザー定義テスター関数は、次のプロトタイプを持っていなければなりません。

    bool yourTester(const T* a, void* d);

クライアントデータは、パラメタ d を通して渡すことができます。

size_type
removeAll(const T* a);

*a と等しい自分自身内の要素 t をすべて削除します。削除した項目数を返します。

size_type
removeAll(bool (*fn)(const T*,void*), void* d);

((*fn)(t,d))TRUE になるような自分自身内の要素 t をすべて削除します。削除した項目数を返します。fn が指すユーザー定義テスター関数は、次のプロトタイプを持っていなければなりません。

    bool yourTester(const T* a, void* d);

クライアントデータは、パラメタ d を通して渡すことができます。

void
resize(size_type sz);

sz の容量を用いて新しいハッシュセットを作成することによって、自分自身の容量を変更します。次に、resize は、自分自身のすべての要素を新しいコンテナにコピーし、最後に、その新しいコンテナの内部表現を自分自身の内部表現と交換します。

rw_hashset<T*,container_hash, container_eq>&
std();
const rw_hashset<T*,container_hash, container_eq>&
std() const;

自分自身に対する実装として使用される、基礎となる C++ 標準コレクションへの参照を返します。

void
symmetricDifference(const RWTPtrHashSet<T,H,EQ>& s);

自分自身と s に対して、自分自身を破壊して対称差集合を計算します。自分自身は結果に置き換えられます。対称差集合は (AB)-(AB) として定義することができます。

void
Union(const RWTPtrHashSet<T,H,EQ>& s);

自分自身と s に対して、自分自身を破壊して和集合を計算します。自分自身は結果に置き換えられます。C++ の予約語との競合を避けるために、Union の「U」は大文字になっていることに注意してください。

関連の大域演算子

RWvostream&
operator<<(RWvostream& strm,
       const RWTPtrHashSet<T,H,EQ>& coll);
RWFile&
operator<<(RWFile& strm,
       const RWTPtrHashSet<T,H,EQ>& coll);

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

RWvistream&
operator>>(RWvistream& strm, RWTPtrHashSet<T,H,EQ>& coll);
RWFile&
operator>>(RWFile& strm, RWTPtrHashSet<T,H,EQ>& coll);

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

RWvistream&
operator>>(RWvistream& strm, RWTPtrHashSet<T,H,EQ>*& p);
RWFile&
operator>>(RWFile& strm, RWTPtrHashSet<T,H,EQ>*& p);

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