#include <iostream>
#include <unordered_set>
struct MyStruct
{
int x, y;
double mutable z;
MyStruct(int x, int y)
: x{ x }, y{ y }, z{ 0.0 }
{
}
};
struct MyStructHash
{
inline size_t operator()(MyStruct const &s) const
{
size_t ret = s.x;
ret *= 2654435761U;
return ret ^ s.y;
}
};
struct MyStructEqual
{
inline bool operator()(MyStruct const &s1, MyStruct const &s2) const
{
return s1.x == s2.x && s1.y == s2.y;
}
};
int main()
{
std::unordered_set<MyStruct, MyStructHash, MyStructEqual> set;
auto pair = set.emplace(100, 200);
if (pair.second)
pair.first->z = 300.0;
std::cout << set.begin()->z;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KCnN0cnVjdCBNeVN0cnVjdAp7CiAgICBpbnQgeCwgeTsKICAgIGRvdWJsZSBtdXRhYmxlIHo7CgogICAgTXlTdHJ1Y3QoaW50IHgsIGludCB5KQogICAgICAgIDogeHsgeCB9LCB5eyB5IH0sIHp7IDAuMCB9CiAgICB7CiAgICB9Cn07CgpzdHJ1Y3QgTXlTdHJ1Y3RIYXNoCnsKICAgIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShNeVN0cnVjdCBjb25zdCAmcykgY29uc3QKICAgIHsKICAgICAgICBzaXplX3QgcmV0ID0gcy54OwogICAgICAgIHJldCAqPSAyNjU0NDM1NzYxVTsKICAgICAgICByZXR1cm4gcmV0IF4gcy55OwogICAgfQp9OwoKc3RydWN0IE15U3RydWN0RXF1YWwKewogICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShNeVN0cnVjdCBjb25zdCAmczEsIE15U3RydWN0IGNvbnN0ICZzMikgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gczEueCA9PSBzMi54ICYmIHMxLnkgPT0gczIueTsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgc3RkOjp1bm9yZGVyZWRfc2V0PE15U3RydWN0LCBNeVN0cnVjdEhhc2gsIE15U3RydWN0RXF1YWw+IHNldDsKICAgIGF1dG8gcGFpciA9IHNldC5lbXBsYWNlKDEwMCwgMjAwKTsKCiAgICBpZiAocGFpci5zZWNvbmQpCiAgICAgICAgcGFpci5maXJzdC0+eiA9IDMwMC4wOwoKICAgIHN0ZDo6Y291dCA8PCBzZXQuYmVnaW4oKS0+ejsKfQo=