Задать вопрос
@rustler2000
погромист сикраш

Есть ли в для C++14 map с поддержкой constexpr хэша?

Есть ли в для C++14 map с поддержкой constexpr хэша?
Хочется, чтобы где можно хэш считался при компиляции, но семантика осталась как у обычного std::unordered_map.
С поддержкой find/insert/erase/...

Миллиона ключей не надо. Не плохо, если можно свою хэш функцию указать.
  • Вопрос задан
  • 1523 просмотра
Подписаться 2 Средний 5 комментариев
Решения вопроса 1
Предрасчитанный ключ - вполне валидная стратегия, если расчёт хеша сильнее влияет на производительность, чем хранение дополнительных 8 байтов на элемент.

template <typename T>
class hashed {
    T value_;
    size_t hash_;

    friend class std::hash<hashed<T>>;
public:
    template <typename... Args>
    constexpr hashed(Args&&... args) :
        value_(std::forward<Args>(args)...),
        hash_(std::hash<T>()(value_))
    {}

    // rule of zero

    constexpr T& get() & noexcept { return value_; }
    constexpr const T& get() const& noexcept { return value_; }
    constexpr T&& get() && noexcept { return value_; }
    constexpr const T&& get() const&& noexcept { return value_; }
};

namespace std {
    template <typename T>
    struct hash<hashed<T>> {
        constexpr size_t operator()(const hashed<T>& x) const noexcept {
            return x.hash_;
        }
    };
}

std::unordered_map<hashed<std::string>, int> cache;
auto it = cache.find("property1");  // хеш на этапе выполнения

// хеш на этапе компиляции, работает с constexpr std::string из C++20
constexpr auto h = hashed<std::string>("property1");

auto it2 = cache.find(h);  // предрасчитанный хеш
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Нет, разумеется. ООП подразумевает смену состояния объекта, а в константных выражениях смена состояния запрещена. Может, и можно какую-то собственную горбушку придумать, но не знаю, как (даже конструктор — смена состояния).

Если же задача — посчитать при компиляции хэш для константного элемента, и всё… вот это интересно, но тоже не знаю, как реализовать.
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Из коробки такого нет, насколько мне известно. Так можно сделать, но все входные данные должны быть известны на этапе компиляции. Довольно редкий случай на практике.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы