I have some code that looks like this:
std::set<int> s1, s2, out;
// ... s1 and s2 are populated ...
std::set_intersection(s1.begin(), s1.end(),
s2.begin(), s2.end(),
std::inserter(out, out.end()));
I’ve read inserts can be done in amortized constant time if the value being inserted to the set immediately follows the iterator given as a “hint”. This would obviously be beneficial when running the set intersection, especially since everything being written to out is already in sorted order.
How do I guarantee this optimal performance? When creating the std::inserter, out is empty so out.begin() == out.end() so I can’t see it makes any difference whether I specify out.begin() or out.end() as the hint. However, if this is interpreted at inserting every element at begin(), it doesn’t seem that I would get the optimum algorithmic performance. Can this be done better?
You could use a custom functor instead of
std::inserterand re-callout.end()every time a new element is inserted.Alternatively, if your values are sorted descendingly,
out.begin()will be fine.