While looking over some code I found loopy and algorithmically slow implementation of std::set_difference :
for(int i = 0; i < a.size(); i++)
{
iter = std
The current code is quite clear, in that it should be obvious to any programmer what's going on.
The current performance is O(a.size() * b.size()
), which may be pretty bad depending upon the actual sizes.
A more concise and STL-like way to describe it is to use remove_if with a predicate that tells you if a value in in a.
b.erase(std::remove_if(b.begin(), b.end(), [](const auto&x) {
return std::find(a.begin(), a.end(), x) != a.end();
}), b.end());
(Not tested, so I might have made a syntax error.) I used a lambda, but you can create a functor if you're not using a C++11 compiler.
Note that the original code removes just one instance of a value in b
that's also in a
. My solution will remove all instances of such a value from b
.
Note that the find
operation happens again and again, so it's probably better to do that on the smaller vector for better locality of reference.