#include <algorithm>
#include <cassert>
#include <iostream>
#include <set>
#include <typeinfo>
#include <vector>
#define RANGE(x) (x).begin(), (x).end()
template<class T>
struct is_STL_container
{
static const bool value = false;
};
template<class T, typename alloc>
struct is_STL_container<std::vector<T, alloc>>
{
static const bool value = true;
};
template<class T, class comp, typename alloc>
struct is_STL_container<std::set<T, comp, alloc>>
{
static const bool value = true;
};
template <class T1, class T2>
typename std::enable_if<is_STL_container<T1>::value && is_STL_container<T2>::value, T1>::type
operator-(const T1 &l, const T2 &r)
{
assert(typeid(typename T1::value_type) == typeid(typename T2::value_type));
T1 result;
std::set_difference(RANGE(l), RANGE(r), std::back_inserter(result));
return result;
}
int main()
{
std::vector<int> a = { 1, 2, 3, 4, 5 };
std::vector<int> b = { 2, 3, 4 };
std::set<int> c = { 2, 3, 4 };
std::vector<int> r = a - b;
for (const auto& v : r)
{
std::cout << v << " ";
}
std::cout << "\n";
r = a - c;
for (const auto& v : r)
{
std::cout << v << " ";
}
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPHR5cGVpbmZvPgojaW5jbHVkZSA8dmVjdG9yPgoKI2RlZmluZSBSQU5HRSh4KSAoeCkuYmVnaW4oKSwgKHgpLmVuZCgpCgp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3QgaXNfU1RMX2NvbnRhaW5lcgp7CiAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOwp9OwoKdGVtcGxhdGU8Y2xhc3MgVCwgdHlwZW5hbWUgYWxsb2M+CnN0cnVjdCBpc19TVExfY29udGFpbmVyPHN0ZDo6dmVjdG9yPFQsIGFsbG9jPj4KewogICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOwp9OwoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgY29tcCwgdHlwZW5hbWUgYWxsb2M+CnN0cnVjdCBpc19TVExfY29udGFpbmVyPHN0ZDo6c2V0PFQsIGNvbXAsIGFsbG9jPj4KewogICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX1NUTF9jb250YWluZXI8VDE+Ojp2YWx1ZSAmJiBpc19TVExfY29udGFpbmVyPFQyPjo6dmFsdWUsIFQxPjo6dHlwZQpvcGVyYXRvci0oY29uc3QgVDEgJmwsIGNvbnN0IFQyICZyKQp7Cglhc3NlcnQodHlwZWlkKHR5cGVuYW1lIFQxOjp2YWx1ZV90eXBlKSA9PSB0eXBlaWQodHlwZW5hbWUgVDI6OnZhbHVlX3R5cGUpKTsKCQogICAgVDEgcmVzdWx0OwogICAgc3RkOjpzZXRfZGlmZmVyZW5jZShSQU5HRShsKSwgUkFOR0UociksIHN0ZDo6YmFja19pbnNlcnRlcihyZXN1bHQpKTsKICAgIHJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKCkKewoJc3RkOjp2ZWN0b3I8aW50PiBhID0geyAxLCAyLCAzLCA0LCA1IH07CglzdGQ6OnZlY3RvcjxpbnQ+IGIgPSB7IDIsIDMsIDQgfTsKCXN0ZDo6c2V0PGludD4gYyA9IHsgMiwgMywgNCB9OwoJCglzdGQ6OnZlY3RvcjxpbnQ+IHIgPSBhIC0gYjsKCWZvciAoY29uc3QgYXV0byYgdiA6IHIpCgl7CgkJc3RkOjpjb3V0IDw8IHYgPDwgIiAiOwoJfQoJCglzdGQ6OmNvdXQgPDwgIlxuIjsKCQoJciA9IGEgLSBjOwoJZm9yIChjb25zdCBhdXRvJiB2IDogcikKCXsKCQlzdGQ6OmNvdXQgPDwgdiA8PCAiICI7Cgl9CgkKCQoJcmV0dXJuIDA7Cn0=