Как использовать функцию is_transparent в строковом литерале с unordered_map из std::string?
Оглядываясь на cppreference, я обнаружил, что std::unordered_map
получает эффективный поиск из "эквивалентных ключей".
Я считаю, что эквивалентный ключ должен иметь одно и то же значение хэш-функции. Как я могу предоставить это для строкового литерала, я получаю то же значение хэша, что и для std::hash<std::string>
, не создавая временную конструкцию std::string
и тем самым делая всю суть эквивалентных ключей для ничего?
Ответы
Ответ 1
Это была ошибка в cppreference; нет шаблонных находок для неупорядоченных связанных контейнеров.
Сравните, с n3690,
от §23.5.4.1[unord.map.overview]
// lookup
iterator find(const key_type& k);
const_iterator find(const key_type& k) const;
size_type count(const key_type& k) const;
from §23.4.4.1[map.overview]
// 23.4.4.5, map operations:
iterator find(const key_type& x);
const_iterator find(const key_type& x) const;
template <class K> iterator find(const K& x);
template <class K> const_iterator find(const K& x) const;
size_type count(const key_type& x) const;
Ответ 2
Как говорили другие, неупорядоченные ассоциативные контейнеры не поддерживают режим is_transparent
. Boost.MultiIndex хешируют индексы, с другой стороны, разрешают то, что вы хотите, как объяснено в , в случае, если вы можете заменить std::unordered_map
на эквивалентную конструкцию на основе multi_index_container
.