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

このエラーは、特定のイテレータ タイプにハッシュ関数を指定する必要があることを意味します。ハッシュ関数を 3 番目のテンプレート パラメーターとして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 に答える