You do not know how rude your approach is. As long as you use the specified query functions in std :: namespace, they are likely to be as efficient as possible. For example, if set_intersection (s1.begin (), s2.end (), m1.begin (), m1.end ()) is equivalent to m1.
You could be more efficient than this, since you do not want to copy the corresponding elements, just to know that they all appear. This can be done by copying the set_intersection code, but changing the implementation to just count the number of matching elements, rather than copying them. Then, if the counter matches the size m, you will get a match.
Regarding containers, I often prefer to sort deque by set for large collections. Memory is much less distributed over the heap, which helps with caching. It also avoids the overhead of the base tree. This is especially useful when containers are created once, but run multiple times.
source share