コメントで述べたように、適切なコードがなければ、普遍的な答えはほとんどありません。ただし、MyStruct
が非常に大きい場合、スタックのコピーにコストがかかる場合があります。MyStruct
おそらく、独自の比較メカニズムへのポインターを格納して実装することは理にかなっています。
template <typename T> struct deref_cmp {
bool operator()(std::shared_ptr<T> lhs, std::shared_ptr<T> rhs) const {
return *lhs < *rhs;
}
};
std::map<std::shared_ptr<MyStruct>, I*, deref_cmp<MyStruct>> mymap;
ただし、これはプロファイルする必要があるものです。それは物事をスピードアップするかもしれません。
このような要素を検索します
template <typename T> struct NullDeleter {
void operator()(T const*) const {}
};
// needle being a MyStruct
mymap.find(std::shared_ptr<MyStruct>(&needle,NullDeleter()));
言うまでもなく、最適化できる可能性はもっとあります。