fork download
  1. #include <iostream>
  2. #include <iterator>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <functional>
  6. using namespace std;
  7.  
  8.  
  9. template<typename Iterator>
  10. struct skip_iterator {
  11. using iterator_category = typename Iterator::iterator_category;
  12. //using iterator_category = std::input_iterator_tag;
  13. using value_type = typename Iterator::value_type;
  14. using difference_type = typename Iterator::difference_type;
  15. using pointer = typename Iterator::pointer;
  16. using reference = typename Iterator::reference;
  17. Iterator _begin, _end;
  18. std::function<bool(value_type const &)> _predicate;
  19. using self_t = skip_iterator<Iterator>;
  20.  
  21. bool operator==(self_t const & rhs) {
  22. return (_begin == rhs._begin);
  23. }
  24. bool operator!=(self_t const & rhs) {
  25. return not (*this == rhs);
  26. }
  27.  
  28. reference operator*(void) {
  29. return *_begin;
  30. }
  31.  
  32. void skip_to_next(void) {
  33. for(; _begin != _end; ++_begin) {
  34. if (not _predicate(*_begin)) {
  35. break;
  36. }
  37. }
  38. }
  39.  
  40. skip_iterator (Iterator b, Iterator e, std::function<bool(value_type const &)> p)
  41. : _begin (b), _end (e), _predicate (p) {
  42. skip_to_next ();
  43. }
  44. self_t end(void) {
  45. return {_end, _end, _predicate};
  46. }
  47. self_t & operator++(void) {
  48. skip_to_next();
  49. return *this;
  50. }
  51. difference_type operator-(self_t const & rhs) {
  52. return _begin - rhs._begin;
  53. }
  54. self_t operator+(difference_type inc) {
  55. return {_begin + inc, _end, _predicate};
  56. }
  57. self_t operator-(difference_type inc) {
  58. return {_begin - inc, _end, _predicate};
  59. }
  60. bool operator<(self_t const & rhs) {
  61. return _begin < rhs._begin;
  62. }
  63. };
  64.  
  65. template<typename Iterator, typename Predicate>
  66. auto make_skip_iterator (Iterator f, Iterator t, Predicate p) {
  67. return skip_iterator<Iterator>{f, t, p};
  68. }
  69.  
  70. int main() {
  71. vector<int> input{1, 2, 3, 4, 5, 6, 8, 10, 11, 13};
  72. auto f = input.begin();
  73. auto t = input.end();
  74. auto from = make_skip_iterator (f, t, [](auto e) { return e % 2 == 0; });
  75. auto to = from.end ();
  76. sort(from, to, greater<int>{});
  77. for (auto e : input) {
  78. cout << e << " ";
  79. }
  80. cout << endl;
  81. return 0;
  82. }
Compilation error #stdin compilation error #stdout 0s 3452KB
stdin
Standard input is empty
compilation info
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);
                               ^
stdout
Standard output is empty