#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
template<typename Iterator>
struct skip_iterator {
using iterator_category = typename Iterator::iterator_category;
//using iterator_category = std::input_iterator_tag;
using value_type = typename Iterator::value_type;
using difference_type = typename Iterator::difference_type;
using pointer = typename Iterator::pointer;
using reference = typename Iterator::reference;
Iterator _begin, _end;
std::function<bool(value_type const &)> _predicate;
using self_t = skip_iterator<Iterator>;
bool operator==(self_t const & rhs) {
return (_begin == rhs._begin);
}
bool operator!=(self_t const & rhs) {
return not (*this == rhs);
}
reference operator*(void) {
return *_begin;
}
void skip_to_next(void) {
for(; _begin != _end; ++_begin) {
if (not _predicate(*_begin)) {
break;
}
}
}
skip_iterator (Iterator b, Iterator e, std::function<bool(value_type const &)> p)
: _begin (b), _end (e), _predicate (p) {
skip_to_next ();
}
self_t end(void) {
return {_end, _end, _predicate};
}
self_t & operator++(void) {
skip_to_next();
return *this;
}
difference_type operator-(self_t const & rhs) {
return _begin - rhs._begin;
}
self_t operator+(difference_type inc) {
return {_begin + inc, _end, _predicate};
}
self_t operator-(difference_type inc) {
return {_begin - inc, _end, _predicate};
}
bool operator<(self_t const & rhs) {
return _begin < rhs._begin;
}
};
template<typename Iterator, typename Predicate>
auto make_skip_iterator (Iterator f, Iterator t, Predicate p) {
return skip_iterator<Iterator>{f, t, p};
}
int main() {
vector<int> input{1, 2, 3, 4, 5, 6, 8, 10, 11, 13};
auto f = input.begin();
auto t = input.end();
auto from = make_skip_iterator (f, t, [](auto e) { return e % 2 == 0; });
auto to = from.end ();
sort(from, to, greater<int>{});
for (auto e : input) {
cout << e << " ";
}
cout << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnRlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yPgpzdHJ1Y3Qgc2tpcF9pdGVyYXRvciB7CiAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSB0eXBlbmFtZSBJdGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnk7CiAgLy91c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnOwogIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBJdGVyYXRvcjo6dmFsdWVfdHlwZTsKICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSB0eXBlbmFtZSBJdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlOwogIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBJdGVyYXRvcjo6cG9pbnRlcjsKICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBJdGVyYXRvcjo6cmVmZXJlbmNlOwogSXRlcmF0b3IgX2JlZ2luLCBfZW5kOwogc3RkOjpmdW5jdGlvbjxib29sKHZhbHVlX3R5cGUgY29uc3QgJik+IF9wcmVkaWNhdGU7CiB1c2luZyBzZWxmX3QgPSBza2lwX2l0ZXJhdG9yPEl0ZXJhdG9yPjsKCiBib29sIG9wZXJhdG9yPT0oc2VsZl90IGNvbnN0ICYgcmhzKSB7CiAgcmV0dXJuIChfYmVnaW4gPT0gcmhzLl9iZWdpbik7CiB9CiBib29sIG9wZXJhdG9yIT0oc2VsZl90IGNvbnN0ICYgcmhzKSB7CiAgcmV0dXJuIG5vdCAoKnRoaXMgPT0gcmhzKTsKIH0KCiByZWZlcmVuY2Ugb3BlcmF0b3IqKHZvaWQpIHsKICByZXR1cm4gKl9iZWdpbjsKIH0KCiB2b2lkIHNraXBfdG9fbmV4dCh2b2lkKSB7CiAgZm9yKDsgX2JlZ2luICE9IF9lbmQ7ICsrX2JlZ2luKSB7CiAgIGlmIChub3QgX3ByZWRpY2F0ZSgqX2JlZ2luKSkgewogICAgYnJlYWs7CiAgIH0KICB9CiB9Cgogc2tpcF9pdGVyYXRvciAoSXRlcmF0b3IgYiwgSXRlcmF0b3IgZSwgIHN0ZDo6ZnVuY3Rpb248Ym9vbCh2YWx1ZV90eXBlIGNvbnN0ICYpPiBwKQogIDogX2JlZ2luIChiKSwgX2VuZCAoZSksIF9wcmVkaWNhdGUgKHApIHsKICBza2lwX3RvX25leHQgKCk7CiB9CiBzZWxmX3QgZW5kKHZvaWQpIHsKICByZXR1cm4ge19lbmQsIF9lbmQsIF9wcmVkaWNhdGV9OwogfQogc2VsZl90ICYgb3BlcmF0b3IrKyh2b2lkKSB7CiAgc2tpcF90b19uZXh0KCk7CiAgcmV0dXJuICp0aGlzOwogfQogZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShzZWxmX3QgY29uc3QgJiByaHMpIHsKICByZXR1cm4gX2JlZ2luIC0gcmhzLl9iZWdpbjsKIH0KIHNlbGZfdCBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIGluYykgewogIHJldHVybiB7X2JlZ2luICsgaW5jLCBfZW5kLCBfcHJlZGljYXRlfTsKIH0KIHNlbGZfdCBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIGluYykgewogIHJldHVybiB7X2JlZ2luIC0gaW5jLCBfZW5kLCBfcHJlZGljYXRlfTsKIH0KIGJvb2wgb3BlcmF0b3I8KHNlbGZfdCBjb25zdCAmIHJocykgewogIHJldHVybiBfYmVnaW4gPCByaHMuX2JlZ2luOwogfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIFByZWRpY2F0ZT4KYXV0byBtYWtlX3NraXBfaXRlcmF0b3IgKEl0ZXJhdG9yIGYsIEl0ZXJhdG9yIHQsIFByZWRpY2F0ZSBwKSB7CiByZXR1cm4gc2tpcF9pdGVyYXRvcjxJdGVyYXRvcj57ZiwgdCwgcH07Cn0KCmludCBtYWluKCkgewogdmVjdG9yPGludD4gaW5wdXR7MSwgMiwgMywgNCwgNSwgNiwgOCwgMTAsIDExLCAxM307CiBhdXRvIGYgPSBpbnB1dC5iZWdpbigpOwogYXV0byB0ID0gaW5wdXQuZW5kKCk7CiBhdXRvIGZyb20gPSBtYWtlX3NraXBfaXRlcmF0b3IgKGYsIHQsIFtdKGF1dG8gZSkgeyByZXR1cm4gZSAlIDIgPT0gMDsgfSk7CiBhdXRvIHRvID0gZnJvbS5lbmQgKCk7CiBzb3J0KGZyb20sIHRvLCBncmVhdGVyPGludD57fSk7CiBmb3IgKGF1dG8gZSA6IGlucHV0KSB7CiAgY291dCA8PCBlIDw8ICIgIjsKIH0KIGNvdXQgPDwgZW5kbDsKIHJldHVybiAwOwp9
In file included from /usr/include/c++/5/bits/stl_algo.h:61:0,
from /usr/include/c++/5/algorithm:62,
from prog.cpp:4:
/usr/include/c++/5/bits/stl_heap.h: In instantiation of 'void std::__sort_heap(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]':
/usr/include/c++/5/bits/stl_algo.h:1929:23: required from 'void std::__partial_sort(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:1943:27: required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Size = int; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:1963:25: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:4729:18: required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = std::greater<int>]'
prog.cpp:76:31: required from here
/usr/include/c++/5/bits/stl_heap.h:395:4: error: no match for 'operator--' (operand type is 'skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >')
--__last;
^
In file included from /usr/include/c++/5/algorithm:62:0,
from prog.cpp:4:
/usr/include/c++/5/bits/stl_algo.h: In instantiation of '_RandomAccessIterator std::__unguarded_partition(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]':
/usr/include/c++/5/bits/stl_algo.h:1918:40: required from '_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:1948:38: required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Size = int; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:1963:25: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:4729:18: required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = std::greater<int>]'
prog.cpp:76:31: required from here
/usr/include/c++/5/bits/stl_algo.h:1899:4: error: no match for 'operator--' (operand type is 'skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >')
--__last;
^
/usr/include/c++/5/bits/stl_algo.h:1901:6: error: no match for 'operator--' (operand type is 'skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >')
--__last;
^
/usr/include/c++/5/bits/stl_algo.h: In instantiation of 'void std::__unguarded_linear_insert(_RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Val_comp_iter<std::greater<int> >]':
/usr/include/c++/5/bits/stl_algo.h:1850:36: required from 'void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:1880:25: required from 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:1966:31: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:4729:18: required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = std::greater<int>]'
prog.cpp:76:31: required from here
/usr/include/c++/5/bits/stl_algo.h:1822:7: error: no match for 'operator--' (operand type is 'skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >')
--__next;
^
/usr/include/c++/5/bits/stl_algo.h:1827:4: error: no match for 'operator--' (operand type is 'skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >')
--__next;
^
In file included from /usr/include/c++/5/bits/char_traits.h:39:0,
from /usr/include/c++/5/ios:40,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iostream:39,
from prog.cpp:1:
/usr/include/c++/5/bits/stl_algobase.h: In instantiation of 'static _BI2 std::__copy_move_backward<true, false, std::random_access_iterator_tag>::__copy_move_b(_BI1, _BI1, _BI2) [with _BI1 = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _BI2 = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >]':
/usr/include/c++/5/bits/stl_algobase.h:600:58: required from '_BI2 std::__copy_move_backward_a(_BI1, _BI1, _BI2) [with bool _IsMove = true; _BI1 = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _BI2 = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >]'
/usr/include/c++/5/bits/stl_algobase.h:610:5: required from '_BI2 std::__copy_move_backward_a2(_BI1, _BI1, _BI2) [with bool _IsMove = true; _BI1 = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _BI2 = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >]'
/usr/include/c++/5/bits/stl_algobase.h:680:48: required from '_BI2 std::move_backward(_BI1, _BI1, _BI2) [with _BI1 = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _BI2 = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >]'
/usr/include/c++/5/bits/stl_algo.h:1846:8: required from 'void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:1880:25: required from 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:1966:31: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<std::greater<int> >]'
/usr/include/c++/5/bits/stl_algo.h:4729:18: required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Compare = std::greater<int>]'
prog.cpp:76:31: required from here
/usr/include/c++/5/bits/stl_algobase.h:562:7: error: no match for 'operator--' (operand type is 'skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >')
*--__result = std::move(*--__last);
^
/usr/include/c++/5/bits/stl_algobase.h:562:31: error: no match for 'operator--' (operand type is 'skip_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >')
*--__result = std::move(*--__last);
^