将迭代器列为无序映射键
List iterator as an unordered-map key
#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::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
命名空间内定义结构的少数实例之一。
#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::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
命名空间内定义结构的少数实例之一。