私はカスタムクラスのためにunordered_map
を使用することについていくつかの点を理解しようとしています。私がシンプルなクラスLine
を定義するところで、私が運動をするのに使うコードは以下の通りです。私は、Line2
をmain()
に挿入すると、なぜの値がLine1
とLine2
の場合には、両方とも3
であると、プログラムの出力がinsert failed
にならないのは混乱しています。 operator==
ファンクションの最初の値(m
)のみをclass Line
に比較するので、このコードのLine1
とLine2
は同じキーを持つ必要があるので注意してください。すでに存在しているキーの挿入が無効であってはなりませんか?なぜ私に説明することができますか?ありがとう!カスタムクラスのためのunordered_mapは、同じキーを挿入するときにエラーを起こさない
#include<iostream>
#include<unordered_map>
using namespace std;
class Line {
public:
float m;
float c;
Line() {m = 0; c = 0;}
Line(float mInput, float cInput) {m = mInput; c = cInput;}
float getM() const {return m;}
float getC() const {return c;}
void setM(float mInput) {m = mInput;}
void setC(float cInput) {c = cInput;}
bool operator==(const Line &anotherLine) const
{
return (m == anotherLine.m);
}
};
namespace std
{
template <>
struct hash<Line>
{
size_t operator()(const Line& k) const
{
// Compute individual hash values for two data members and combine them using XOR and bit shifting
return ((hash<float>()(k.getM())^(hash<float>()(k.getC()) << 1)) >> 1);
}
};
}
int main()
{
unordered_map<Line, int> t;
Line line1 = Line(3.0,4.0);
Line line2 = Line(3.0,5.0);
t.insert({line1, 1});
auto x = t.insert({line2, 2});
if (x.second == false)
cout << "insert failed" << endl;
for(unordered_map<Line, int>::const_iterator it = t.begin(); it != t.end(); it++)
{
Line t = it->first;
cout << t.m << " " << t.c << "\n" ;
}
return 1;
}
あなたの演算子==は、衝突時にのみ使用されます。 –