по string_view, когда типом ключа на самом деле является std::string?
Судя по доке функции find (https://en.cppreference.com/w/cpp/container/unordered_map/find), сейчас это можно сделать (с с++ 20 как раз), но для этого нужно писать свой хэшер, хотя вроде очевидно, что хэш string_view это такой же хэш как у std::string – почему так? Заставлять писать свой хэшер там, где не нужно, выглядит не оч привлекательно
Можно использовать хэшер для вьюхи в качестве основного
Как это сделать не в 100500 строк кода?)
unordered_map<string, int, hash<string_view>, equal_to<>> Лучше, чем ничего
А equal_to точно надо сетить? Из-коробочный для string разве не подойдет?
Он же ждет string, как и хэш
https://godbolt.org/z/bGG6TE4de Что-то я не могу понять почему оно не заводится
как минимум, он не transparent
Т.е. всё-таки надо писать свой struct string_hash?)
Ок, можно унаследоваться
struct my_hash : std::hash<std::string_view> { using is_transparent = void; } правда там какие-то ещё нюансы были, емнип
https://www.reddit.com/r/cpp/comments/phqxiq/transparent_find_is_a_pain_to_get_right/ :)
https://godbolt.org/z/Ghn7vnn48 так всё равно не работает
unordered_map<string, int, sv_hash, equal_to<>> x;
А что насчёт хеша вида [](auto&& v){ if constexpr string_view / string} ))
А в чем отличие equal_to<> от equal_to<string_view>?
equal_to<> == equal_to<void>, который transparent
Обсуждают сегодня