fork download
  1. #include <algorithm>
  2. #include <cassert>
  3. #include <iostream>
  4. #include <set>
  5. #include <typeinfo>
  6. #include <vector>
  7.  
  8. #define RANGE(x) (x).begin(), (x).end()
  9.  
  10. template<class T>
  11. struct is_STL_container
  12. {
  13. static const bool value = false;
  14. };
  15.  
  16. template<class T, typename alloc>
  17. struct is_STL_container<std::vector<T, alloc>>
  18. {
  19. static const bool value = true;
  20. };
  21.  
  22. template<class T, class comp, typename alloc>
  23. struct is_STL_container<std::set<T, comp, alloc>>
  24. {
  25. static const bool value = true;
  26. };
  27.  
  28.  
  29. template <class T1, class T2>
  30. typename std::enable_if<is_STL_container<T1>::value && is_STL_container<T2>::value, T1>::type
  31. operator-(const T1 &l, const T2 &r)
  32. {
  33. assert(typeid(typename T1::value_type) == typeid(typename T2::value_type));
  34.  
  35. T1 result;
  36. std::set_difference(RANGE(l), RANGE(r), std::back_inserter(result));
  37. return result;
  38. }
  39.  
  40. int main()
  41. {
  42. std::vector<int> a = { 1, 2, 3, 4, 5 };
  43. std::vector<int> b = { 2, 3, 4 };
  44. std::set<int> c = { 2, 3, 4 };
  45.  
  46. std::vector<int> r = a - b;
  47. for (const auto& v : r)
  48. {
  49. std::cout << v << " ";
  50. }
  51.  
  52. std::cout << "\n";
  53.  
  54. r = a - c;
  55. for (const auto& v : r)
  56. {
  57. std::cout << v << " ";
  58. }
  59.  
  60.  
  61. return 0;
  62. }
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
1 5 
1 5