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

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


RWTValMultiMap<K,T,C>

形式

#include <rw/tvmmap.h>
RWTValMultiMap<K,T,C> m;

標準 C++ ライブラリ依存


注 - RWTValMultiMap には標準 C++ ライブラリが必要です。

説明

このクラスは、それぞれが型 T の関連付けられた項目を持つキーのコレクションを維持します。順序は、型 C の比較オブジェクトに従って、キーによって決定されます。C は、次の公開メンバーを介して、型 K の要素に対する全順序付けを誘導しなければなりません。

    bool operator()(const K& x, const K& y) const
これは、コレクション内において、x とそのパートナーが y とそのパートナーより前になる場合、TRUE を返します。C++ 標準ヘッダーファイル <functional> からの構造体 less<T> がその例です。

RWTValMultiMap<K,T,C> には、互いに等しい複数のキーを含めることができます (RWTValMap<K,T,C> は、コレクション内の既存のキーと等しいキーは受け付けません)。等しいかどうかは、== 演算子ではなく、比較オブジェクトにもとづいて判定されます。比較オブジェクト comp を使用するとき、キー ab は次の場合に等しくなります。

    !comp(a,b) && !comp(b,a)

持続性

同形

この例では、RWCStringRWDate のマップを使用しています。

//
// tvmmbday.cpp
//
#include <rw/tvmmap.h>
#include <rw/cstring.h>
#include <rw/rwdate.h>
#include <iostream.h>
#include <function.h>

main(){
  typedef RWTValMultiMap<RWCString, RWDate, less<RWCString> >
     RWMMap;
  RWMMap birthdays;

  birthdays.insert("John", RWDate(12, "April",1975));
  birthdays.insert("Ivan", RWDate(2, "Nov", 1980));
  birthdays.insert("Mary", RWDate(22, "Oct", 1987));
  birthdays.insert("Ivan", RWDate(19, "June", 1971));
  birthdays.insert("Sally",RWDate(15, "March",1976));
  birthdays.insert("Ivan",  RWDate(6, "July", 1950));

  // 「Ivan」がいくつあるか?
  RWMMap::size_type n = birthdays.occurrencesOf("Ivan");
  RWMMap::size_type idx = 0;
  cout << "There are " << n << " Ivans:" << endl;
  RWMMap::iterator iter = birthdays.std().lower_bound("Ivan");
  while (++idx <= n)
    cout << idx << ".  " << (*iter++).second << endl;
  return 0;
}

プログラム出力:

There are 3 Ivans:
1.  11/02/80
2.  06/19/71
3.  07/06/50

関連クラス

クラス RWTValMap<K,T,C> は、互いに等しい複数のキーを受け付けないコレクションに対して同じインタフェースを提供します。RWTValMultiSet<T,C> は、関連付けられた値のないキーのコレクションを維持します。

クラス multimap<K,T,C,allocator> は、このコレクションの基礎となる実装として使用される C++ 標準コレクションです。

公開 Typedef

typedef multimap<K,T,C,allocator>             container_type;
typedef container_type::iterator              iterator;
typedef container_type::const_iterator        const_iterator;
typedef container_type::size_type             size_type;
typedef pair <const K,T>                       value_type;
typedef pair <const K,T>&                      reference;
typedef const pair <const K,T>&                const_reference;

公開コンストラクタ

RWTValMultiMap<K,T,C>(const C& comp = C());

コンパレータ comp で空のマップを作成します。

RWTValMultiMap<K,T,C>(const container_type& m);

m のすべての要素をコピーすることによって、マップを作成します。

RWTValMultiMap<K,T,C>(const RWTValMultiMap<K,T,C>& rwm);

コピーコンストラクタ。

RWTValMultiMap<K,T,C>
(const value_type* first, const value_type* last,
 const C& comp = C());

first が指す T の配列から last が指す要素まで (ただし、その要素は含みません)、 要素をコピーすることによって、マップを作成します。

公開メンバー演算子

RWTValMultiMap<K,T,C>&
operator=(const RWTValMultiMap<K,T,C>& m);
RWTValMultiMap<K,T,C>&
operator=(const container_type& m) const;

自分自身のすべての要素を破棄し、m からすべての関連付けをコピーすることによって、それらを置き換えます。

bool
operator<(const RWTValMultiMap<K,T,C>& m);
bool
operator<(const container_type& m) const;

自分自身が辞書形式で m より小さい場合は TRUE を返し、等しいか大きい場合は FALSE を返します。型 K に明確に規定された less-than 意味論 (T::operator<(const T&) または同等のもの) があると仮定します。

bool
operator==(const RWTValMultiMap<K,T,C>& m) const;
bool
operator==(const container_type& m) const;

自分自身が m と等しい場合は TRUE を返し、それ以外の場合は FALSE を返します。2 つのコレクションのエントリ数が同じで、両方のコレクションを反復したときに個々のペアが互いに等しい場合、両者は等しいと言えます。

公開メンバー関数

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

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

   void yourfun(const K& key, T& a, void* d);
   void yourfun(const K& key, const T& a,void* d);

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

void
applyToKeyAndValue(void (*fn)(const K&, T&, void*),void* d);
void
applyToKeyAndValue
(void (*fn)(const K&, const T&, void*),void* d) const;

これは、上記 apply メンバーの陳腐化した (古くなった) バージョンです。機能は apply とまったく同じです。

iterator
begin();
const_iterator
begin() const;

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

void
clear();

自分自身から項目をすべて削除することによって、コレクションを消去します。各キーとそれに関連付けられた項目のデストラクタを呼び出します。

bool
contains(const K& key) const;

自分自身内に key と等しいキー j が存在する場合は TRUE を返し、それ以外の場合は FALSE を返します。

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

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

   bool yourTester(const_reference a, void* d);

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

iterator
end();
const_iterator
end() const;

自分自身内の最後の関連付けの「直後」にある反復子を返します。

size_type
entries() const;

自分自身内の関連付けの数を返します。

bool
find(const K& key, Key& r) const;

自分自身内に key と等しいキー j が存在する場合は、jr に代入し、TRUE を返します。それ以外の場合は、FALSE を返し、r の値は変更しません。

bool
find(bool (*fn)(const_reference,void*),void* d,
     pair<K,T>& r) const;

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

   bool yourTester(const_reference a, void* d);

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

bool
findValue(const K& key, T& r) const;

自分自身内に key と等しいキー j が存在する場合は、j に関連付けられている項目を r に代入し、TRUE を返します。それ以外の場合は、FALSE を返し、r の値は変更しません。

bool
findKeyValue(const K& key, K& kr, T& tr) const;

自分自身内に key と等しいキー j が存在する場合は、jkr に代入し、j に関連付けられている項目を tr に代入し、TRUE を返します。それ以外の場合は、FALSE を返し、krtr の値は変更しません。

bool
insert(const K& key, const T& a);

項目 a が関連付けられている key をコレクションに追加します。TRUE を返します。

bool
insertKeyAndValue(const K& key, const T& a);

これは、上記 insert メンバーの陳腐化した (古くなった) バージョンです。機能は insert とまったく同じです。

bool
isEmpty() const;

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

size_type
occurrencesOf(const K& key) const;

key と等しい自分自身内のキー j の数を返します。

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

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

   bool yourTester(const_reference a, void* d);

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

bool
remove(const K& key);

自分自身内で jkey と等しいキー j との最初の関連付けを削除し、TRUE を返します。そのような関連付けが存在しない場合は、FALSE を返します。

bool
remove(bool (*fn)(const_reference,void*), void* d);

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

   bool yourTester(const_reference a, void* d);

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

size_type
removeAll(const K& key);

自分自身内で key と等しいキー j を持つ関連付けをすべて削除します。削除した項目数を返します。

size_type
removeAll(bool (*fn)(const_reference,void*), void* d);

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

   bool yourTester(const_reference a, void* d);

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

multimap<K,T,C,allocator>&
std();
const multimap<K,T,C,allocator>&
std() const;

自分自身に対する実装として使用される、基礎となる C++ 標準コレクションへの参照を返します。この参照は自由に使用でき、C++ 標準インタフェースへのアクセスを提供したり、C++ 標準コレクションを利用する他のソフトウェアソフトウェアコンポーネントとの相互運用性を提供します。

関連の大域演算子

RWvostream&
operator<<(RWvostream& strm,
       const RWTValMultiMap<K,T,C>& coll);
RWFile&
operator<<(RWFile& strm, const RWTValMultiMap<K,T,C>& coll);

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

RWvistream&
operator>>(RWvistream& strm, RWTValMultiMap<K,T,C>& coll);
RWFile&
operator>>(RWFile& strm, RWTValMultiMap<K,T,C>& coll);

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

RWvistream&
operator>>(RWvistream& strm, RWTValMultiMap<K,T,C>*& p);
RWFile&
operator>>(RWFile& strm, RWTValMultiMap<K,T,C>*& p);

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