Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <algorithm>
- template<typename T, typename F>
- F myremove(T t_begin, T t_end, F f_begin, F f_end)
- {
- std::vector<int> t_copy(t_begin, t_end);
- std::sort(t_copy.begin(), t_copy.end());
- auto valid_begin = t_copy.begin();
- auto valid_end = std::unique(t_copy.begin(), t_copy.end());
- auto size = size_t(std::distance(f_begin, f_end));
- for (auto i = valid_begin; i != valid_end; i++) {
- if (*i < 0) {
- valid_begin = i + 1;
- } else if (size_t(*i) > size) {
- valid_end = i;
- break;
- }
- }
- if (valid_begin == valid_end) {
- return f_end;
- }
- int counter = 0;
- auto j = valid_begin;
- auto dist = 0;
- for (auto i = f_begin; i != f_end; ++i, ++dist) {
- if (j != valid_end && *j == dist) {
- ++j;
- ++counter;
- continue;
- }
- if (counter > 0) {
- std::swap(*(i), *(i - counter));
- }
- }
- return std::next(f_end, -counter);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement