2016-10-22 1 views
0

おそらく何か非常にばかげたことをしていますが、なぜfindsuppIDに相当するキーを持つ要素を見つけられないのか分かりません。C++ std :: map :: iteratorは何も見つかりませんでしたが、添字演算子はマップされた値への参照を返しますか?

しかし、添え字演算子suppIDを渡すと、マップされた値への参照が返されます(何か見つかったことを暗示していますか?)。

std::map添字演算子を使用するときにまだ存在しない新しいキー値のデフォルト値を挿入しているためだ
typedef std::map<SuppID, Supplement *> Supplement_t; 

Supplement_t::iterator it = supplements.find(suppID); //it = supplements.end() 

cout << "Supplement name: " << supplements[suppID]->getName() << endl; // "Cytogainer" 
... // Returns few of many other data members I tested... 
+2

私は、 'SuppID'は複雑な型で、あなた自身の' <'を書きました。 – Yakk

+0

@Yakk Correct。そのヒントは私にさらに読ませ、すべての要素が反射的に誤って返る必要があることを発見しました。現在彼らはしていないので、それは確かに問題だと思う。 –

答えて

1

アソシエーティブコンテナに<を書き込むと、間違ってしまうのは簡単です。

簡単な方法は、タプル、参照または値、または混合のいずれかを返す関数またはメソッドを書くことです。 fooに電話してください。

friend bool operator<(self const& lhs, self const& rhs){ 
    return lhs.foo()<rhs.foo(); 
} 

<を間違って書くと、あなたは単に狂気のようになります。

2

としてはhereを述べ:

1)キーが存在しない場合VALUE_TYPE(キー、T())を挿入。この関数は、return insert(std :: make_pair(key、T()))と等価です。 -key_typeはCopyConstructibleの要件を満たしている必要があります。 -mapped_typeは、CopyConstructibleおよびDefaultConstructibleの要件を満たしている必要があります。 挿入が実行されると、マップされた値が値で初期化され(クラス型の場合はデフォルトで構築され、そうでない場合はゼロで初期化されます)、その参照が返されます。

+0

私は同様に読みましたが、その要素がデフォルトのコンストラクタを使って構築されているとは思われません。したがって、 'Supplement *'の 'getName()'は '' default protein shake ''の代わりに' 'cytogainer" 'を返します。非常に混乱。 –

+0

@olololololまあ、その狭いサンプルから、なぜそれが起こるのかは分かりません。 –

関連する問題