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 が足りないなど)と使われないままになるので、よく確認してください。