Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, saf_e, Вы писали:
_>>Здравствуйте, watchmaker, Вы писали:
W>>>Но тут, конечно же всё ломается из-за неперемещаемых типов:struct U {
W>>> U(int);
W>>> U(const U&) = delete; // oops
W>>> friend bool operator==(const U&, const U&);
W>>>};
W>>>
W>>>а сейчас такой emplace валидный.
W>И это даже не скомпилируется с тем классом, который ты так предусмотрительно процитировал в сообщении.
Не совсем понял почему, я наверное что-то упустил, но если можно создать ноду (т.е. ключ+значение в случае мапы) то можно создать и ключ, не? Сет не сильно интересен, т.к. стоимость создания ноды и ключа примерна равна.
_>> т.к. обычно обьект ключа легковесный, а вся жесть в значении )
W>Отлично ищется: https://godbolt.org/z/dhhafr8b1
W>В чём проблема?
namespace std {
template<>
struct hash<S> {
size_t operator()(const S& s) const {
return reinterpret_cast<uintptr_t>(this);
}
};
}
Например этот код показывает что значение хеша всем "до лампочки", т.к. поменяв его на
size_t operator()(const S& s) const {
return reinterpret_cast<uintptr_t>(&s);
}
Или даже:
size_t operator()(const S& s) const {
return 12345678;
}
Твой пример работает )
Главная проблема с хешом зависящим от this — это то что он будет меняться при пересоздании объекта. И если мы не говорим про указатели, то попытка искать такой объект закончиться тем что мы будет искать его с другим хешом, а значит потеряем преимущество хеш-контейнера.