2

我想创建一个映射,它使用迭代器作为键类型和整数作为值,如下例所示:

#include <list>
#include <unordered_map>

int main(int argc, char* argv[])
{
  typedef std::list<int> ListType;
  typedef std::unordered_multimap<ListType::iterator, unsigned int> MapType;

  ListType _list;
  MapType _map;

  _list.push_back(100);
  _map.insert(std::make_pair(_list.begin(), 10));

  return 0;
}

不幸的是,这会使编译器中止error C2440: 'conversion' : cannot convert from 'const std::_List_iterator<_Mylist>' to 'size_t'. 无论如何我可以做些什么来实现这一目标?

4

1 回答 1

1

该错误意味着您必须为特定的迭代器类型提供哈希函数。您可以将散列函数作为第三个模板参数传递给std::unordered_map

unordered_map它的键也需要一个相等比较器,但是 std::list 的迭代器已经有了,所以你不需要提供你自己的。例如:

#include <list>
#include <unordered_map>
#include <cstddef>

typedef std::list<int> ListType;
typedef std::list<int>::iterator ListIterator;
// a very poor hashing functor
struct MyHash {
  size_t operator()(const ListIterator&) const {
    // provide a useful implementation here!
    size_t hash_ = .... ;
    return hash_;
    //return 0; // compiles, but is useless
  }
};

typedef std::unordered_multimap<ListIterator, unsigned int, MyHash> MapType;

int main() {

  ListType list_;
  MapType map_;

  list_.push_back(100);
  map_.insert(std::make_pair(list_.begin(), 10));

  return 0;
}
于 2012-06-05T07:28:13.343 回答