C ++ 11 container requirements say a == b equivalent
distance(a.begin(), a.end()) == distance(b.begin(), b.end()) && equal(a.begin(), a.end(), b.begin())
and std::equal does not use your own comparison, it uses operator==
You can do the comparison yourself by calling std::equal using a special predicate:
a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin(), [](PersonUniquePtr const& p1, PersonUniquePtr const& p2) { PersonUniquePtr_less cmp; return !cmp(p1, p2) && !cmp(p2, p1); });
In C ++ 14, this is simpler because the new std::equal overload accepts four iterators, although, as TemplateRex points out in the comment below, it is less efficient than a.size() == b.size() testing a.size() == b.size() :
std::equal(a.begin(), a.end(), b.begin(), b.end(), [](PersonUniquePtr const& p1, PersonUniquePtr const& p2) { PersonUniquePtr_less cmp; return !cmp(p1, p2) && !cmp(p2, p1); });
In C ++ 14, you can save some typing using polymorphic lambda:
std::equal(a.begin(), a.end(), b.begin(), b.end(), [](auto const& p1, auto const& p2) { PersonUniquePtr_less cmp; return !cmp(p1, p2) && !cmp(p2, p1); });