Re[7]: unorderd_map внутри unordered_map и emplace()
От: saf_e  
Дата: 13.01.22 09:40
Оценка:
Здравствуйте, 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 — это то что он будет меняться при пересоздании объекта. И если мы не говорим про указатели, то попытка искать такой объект закончиться тем что мы будет искать его с другим хешом, а значит потеряем преимущество хеш-контейнера.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.