Как отмечает Калеб, асимптотически быстрее сначала сортировать входные данные.
Вот кое-что, что использует std::set_intersection
и все же умело возвращается с нетерпением.
struct Found{};
struct Finder : std::iterator<std::output_iterator_tag, void, void, void, void> // for brevity
{
Finder* operator->() { return this; }
Finder& operator*() { return *this; }
Finder& operator=(int) { throw Found{}; }
Finder& operator++() { return *this; }
Finder& operator++(int) { return *this; }
};
bool any_intersection(std::vector<int> lhs, std::vector<int> rhs)
{
std::sort(lhs.begin(), lhs.end());
std::sort(rhs.begin(), rhs.end());
try { std::set_intersection(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), Finder{}); }
catch (Found &) { return true; }
return false;
}