#include <bits/stdc++.h>
int main ()
{
std::unordered_map<std::list<int>::iterator, int> map;
return 0;
}
Этот код не компилируется. Ошибка:
error: no match for call to ‘(const std::hash<std::_List_iterator<int> >) (const std::_List_iterator<int>&)’
noexcept(declval<const _Hash&>()(declval<const _Key&>()))>
Я предполагаю, что по какой-то причине я не могу использовать итератор списка в качестве ключа карты, но есть ли способ заставить его работать? Я могу изменить свой дизайн, чтобы не требовать этого, но я бы предпочел использовать итератор списка в качестве ключа карты.
Если вы хотите устранить ошибку, вам нужно специализировать класс std::hash
для вашего типа ключа.
Вам нужно определить, как генерируется хэш для std::List<int>::iterator
. Вы можете сделать это, настроив структуру шаблона std::hash
для этого типа. Вот наивная реализация:
namespace std
{
template<> struct hash<std::list<int>::iterator>
{
std::size_t operator()(std::list<int>::iterator const& iter) const noexcept
{
return (std::size_t)&(*iter);
}
};
}
Единственным преимуществом является то, что он позволяет избежать столкновений.
Кроме того, это один из немногих случаев, когда вам разрешено определять структуру внутри пространства имен std
.
Итераторы списка не имеют определенной хеш-функции (как видно из сообщения об ошибке). Поэтому вы должны предоставить свою собственную хеш-функцию. Я думаю, это сработает, хотя это немного странно.