将迭代器列为无序映射键

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 命名空间内定义结构的少数实例之一。