Кажется, я могу получить итератор, используя пользовательский предикат с lower_bound. Поскольку std :: set является упорядоченным контейнером, lower_bound должен работать логарифмически.
std::set<std::unique_ptr<MyClass>>::iterator i =
std::lower_bound(mySet.begin(), mySet.end(), myClass, MyPredicate<MyClass>());
template<class Type>
struct MyPredicate
{
bool operator()(const std::unique_ptr<Type>& left, const Type* right) const
{
return left.get() < right;
}
}