2009-09-04 7 views
4

私はSTLを初めて使っています。マップを使用して任意のオブジェクトを格納することについて私に悩まされているもの:任意のクラスオブジェクトをキーとして使用する予定がある場合は、stlマップを使用できますか?

std::map<MyClassObj, MyDataObject> MyMap; 

オブジェクトを検索する方法です。 MyMap.find(MyClassObjInstance)はどのように動作しますか?私自身のイテレータを実装し、いくつかの等価関数を含むいくつかの標準関数を提供する必要がありますか?どんな例であれ評価されるでしょう。

標準ライブラリを使用して任意のオブジェクトの関連リストを格納する別の方法はありますか?私はすでにプラットフォームの移植性を維持するためにstlを使用していますが、BOOSTのような別のライブラリ依存性を追加したくないです。

答えて

8

std::mapには、キーと値の後に、どの機能がキーを比較するために使用されるのかを示す3番目のテンプレート引数があります。デフォルトでは、それはoperator<を使用するstd::lessです。あなたのクラスに演算子<がある場合、それはOKです。そうでなければ、あなた自身のコンパレータを提供することができます。

+0

うわー、私の目は、その3番目のパラメータをスキミングしました!私はあまり気にしないパラメータの束を使って関数のオーバーロードを見て慣れていると思う。ありがとう! – AlanKley

+0

:)便利なことに、4番目のパラメータであるアロケータについては忘れてしまいました。私はそれがまだ使われているのを見たことはありません。 – xtofl

+0

@ Xtofl:XP用のサービスパックは、ヒープに割り当てられた何百もの整数の割り当てを解除する際のパフォーマンスを大幅に変更したため、以前はアロケータを使用する必要がありました。 – Jherico

6

にはoperator<を定義する必要があります。 std :: mapの詳細についてはhereを参照してください。 C++標準23.1.2による

フレーズ「『キーの等価』」キーの比較としない オペレータ==によって課さ同値関係を意味します。つまり、2つのキーk1とk2は、比較の場合、等しいとみなされます。 オブジェクトcomp、comp(k1、k2)== false & & comp(k2、k1)== false。

デフォルトではcompstd::lessです。 C++標準20.3.3によると

template <class T> struct less : binary_function<T,T,bool> { 
bool operator()(const T& x, const T& y) const; 
}; 

// operator() returns x < y. 

きっと、あなたは比較のために、スタンドアローンファンクタcompを定義することができます。

+0

これは私が望んでいた答えのタイプで、すべてのドキュメントでそれを見つけることができませんでした。これはどこに文書化されていますか? – AlanKley

+1

ほとんどの場合、最初の行で 'operator <'を意味するときは、www.sgi.com/tech/stl – xtofl

+0

Typo: 'operator>'を見てください。 –

2

はい、独自のタイプ/オブジェクトをキーとして使用できます。すべての順序付けされた標準C++コンテナは、この演算子を使って順序付けと等価性をテストするため、less-than演算子(演算子<)を実装する必要があります。

3

マップの完全なタイプは

template < class Key, class T, class Compare = less<Key>, 
     class Allocator = allocator<pair<const Key,T> > > class map; 

それは、デフォルトではより少ないが、使用している限り、あなたは、オブジェクトの2つのインスタンスを取るために、オーバーロード演算子を()があり、すべてのブール値を返すクラスを渡すよう順調です。あなたがcomp(a、b)を与えてtrueを返すならば、aはorderingの前に来るべきです。

関連する問題