7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

map, unordered_map のキーとして shared_ptr<MyClass>を使う

Last updated at Posted at 2015-02-10

std::map, std::unordered_map のキーとして std::shared_ptr<MyClass>を使うと、そのままではポインタ同士の比較になってしまいます。
それでは不都合で、比較関数やハッシュ関数をカスタマイズしたいということも多いかと思います。
そのような場合、std::less(mapの場合)やstd::hash, std::equal_to(unordered_mapの場合)を std::shared_ptr<MyClass> に対して特殊化する必要があります。

前提として、MyClass は operator<() や operator==(), hash() を持っているとします。

以下のようになります。

std::mapの場合:

namespace std {
template <>
struct less<shared_ptr<MyClass>>
{
  bool operator()(const shared_ptr<MyClass> &a, const shared_ptr<MyClass> &b) const {
    return *a < *b;
  }
};
}

std::unordered_mapの場合:

namespace std {
template <>
struct hash<shared_ptr<MyClass>>
{
  size_t operator()(const shared_ptr<MyClass> &ptr) const {
    return ptr->hash();
  }
};
template <>
struct equal_to<shared_ptr<MyClass>>
{
  bool operator()(const shared_ptr<MyClass> &a, const shared_ptr<MyClass> &b) const {
    return *a == *b;
  }
};
}

std::set や std::unordered_set の場合も同じです。

関数のシグニチャが間違っている(const が足りないなど)と使われないままになるので、よく確認してください。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?