Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.03 KB | None | 0 0
  1. #include <vector>
  2. #include <algorithm>
  3.  
  4. template<typename T, typename F>
  5. F myremove(T t_begin, T t_end, F f_begin, F f_end)
  6. {
  7.     std::vector<int> t_copy(t_begin, t_end);
  8.  
  9.     std::sort(t_copy.begin(), t_copy.end());
  10.     auto valid_begin = t_copy.begin();
  11.     auto valid_end = std::unique(t_copy.begin(), t_copy.end());
  12.  
  13.     auto size = size_t(std::distance(f_begin, f_end));
  14.     for (auto i = valid_begin; i != valid_end; i++) {
  15.         if (*i < 0) {
  16.             valid_begin = i + 1;
  17.         } else if (size_t(*i) > size) {
  18.             valid_end = i;
  19.             break;
  20.         }
  21.     }
  22.     if (valid_begin == valid_end) {
  23.         return f_end;
  24.     }
  25.  
  26.     int counter = 0;
  27.     auto j = valid_begin;
  28.     auto dist = 0;
  29.     for (auto i = f_begin; i != f_end; ++i, ++dist) {
  30.         if (j != valid_end && *j == dist) {
  31.             ++j;
  32.             ++counter;
  33.             continue;
  34.         }
  35.  
  36.         if (counter > 0) {
  37.             std::swap(*(i), *(i - counter));
  38.         }
  39.     }
  40.     return std::next(f_end, -counter);
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement