PIVector reverse_iterator sort

This commit is contained in:
Andrey
2022-04-07 18:17:23 +03:00
parent 397d273802
commit 60c9d60079
2 changed files with 72 additions and 29 deletions

View File

@@ -231,9 +231,11 @@ public:
typedef std::random_access_iterator_tag iterator_category; typedef std::random_access_iterator_tag iterator_category;
inline iterator(): parent(0), pos(0) {} inline iterator(): parent(0), pos(0) {}
inline T & operator *() {return (*parent)[pos];} inline T & operator *() {return (*parent)[pos];}
inline const T & operator *() const {return (*parent)[pos];} inline const T & operator *() const {return (*parent)[pos];}
inline T & operator ->() {return (*parent)[pos];} inline T & operator ->() {return (*parent)[pos];}
inline const T & operator ->() const {return (*parent)[pos];}
inline iterator & operator ++() {++pos; return *this;} inline iterator & operator ++() {++pos; return *this;}
inline iterator & operator ++(int) {const auto tmp = *this; ++*this; return tmp;} inline iterator & operator ++(int) {const auto tmp = *this; ++*this; return tmp;}
@@ -247,7 +249,7 @@ public:
friend inline iterator operator -(const iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;} friend inline iterator operator -(const iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;}
friend inline iterator operator -(size_t p, const iterator & it) {return it - p;} friend inline iterator operator -(size_t p, const iterator & it) {return it - p;}
friend inline size_t operator-(const iterator & it1, const iterator & it2) {return it1.pos - it2.pos;} friend inline std::ptrdiff_t operator -(const iterator & it1, const iterator & it2) {return it1.pos - it2.pos;}
friend inline iterator operator +(const iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;} friend inline iterator operator +(const iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;}
friend inline iterator operator +(size_t p, const iterator & it) {return it + p;} friend inline iterator operator +(size_t p, const iterator & it) {return it + p;}
@@ -274,8 +276,9 @@ public:
typedef std::random_access_iterator_tag iterator_category; typedef std::random_access_iterator_tag iterator_category;
inline const_iterator(): parent(0), pos(0) {} inline const_iterator(): parent(0), pos(0) {}
inline const T & operator *() const {return (*parent)[pos];} inline const T & operator *() const {return (*parent)[pos];}
inline const T & operator->() {return (*parent)[pos];} inline const T & operator ->() const {return (*parent)[pos];}
inline const_iterator & operator ++() {++pos; return *this;} inline const_iterator & operator ++() {++pos; return *this;}
inline const_iterator & operator ++(int) {const auto tmp = *this; ++*this; return tmp;} inline const_iterator & operator ++(int) {const auto tmp = *this; ++*this; return tmp;}
@@ -289,7 +292,7 @@ public:
friend inline const_iterator operator -(const const_iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;} friend inline const_iterator operator -(const const_iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;}
friend inline const_iterator operator -(size_t p, const const_iterator & it) {return it - p;} friend inline const_iterator operator -(size_t p, const const_iterator & it) {return it - p;}
friend inline size_t operator-(const const_iterator & it1, const const_iterator & it2) {return it1.pos - it2.pos;} friend inline std::ptrdiff_t operator -(const const_iterator & it1, const const_iterator & it2) {return it1.pos - it2.pos;}
friend inline const_iterator operator +(const const_iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;} friend inline const_iterator operator +(const const_iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;}
friend inline const_iterator operator +(size_t p, const const_iterator & it) {return it + p;} friend inline const_iterator operator +(size_t p, const const_iterator & it) {return it + p;}
@@ -316,14 +319,35 @@ public:
typedef std::random_access_iterator_tag iterator_category; typedef std::random_access_iterator_tag iterator_category;
inline reverse_iterator(): parent(0), pos(0) {} inline reverse_iterator(): parent(0), pos(0) {}
inline T & operator *() {return (*parent)[pos];} inline T & operator *() {return (*parent)[pos];}
inline const T & operator *() const {return (*parent)[pos];} inline const T & operator *() const {return (*parent)[pos];}
inline void operator ++() {--pos;} inline T & operator ->() {return (*parent)[pos];}
inline void operator ++(int) {--pos;} inline const T & operator ->() const {return (*parent)[pos];}
inline void operator --() {++pos;}
inline void operator --(int) {++pos;} inline reverse_iterator & operator ++() {--pos; return *this;}
inline reverse_iterator & operator ++(int) {const auto tmp = *this; --*this; return tmp;}
inline reverse_iterator & operator --() {++pos; return *this;}
inline reverse_iterator & operator --(int) {const auto tmp = *this; ++*this; return tmp;}
inline reverse_iterator & operator +=(const reverse_iterator & it) {pos -= it.pos; return *this;}
inline reverse_iterator & operator +=(size_t p) {pos -= p; return *this;}
inline reverse_iterator & operator -=(const reverse_iterator & it) {pos += it.pos; return *this;}
inline reverse_iterator & operator -=(size_t p) {pos += p; return *this;}
friend inline reverse_iterator operator -(const reverse_iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;}
friend inline reverse_iterator operator -(size_t p, const reverse_iterator & it) {return it - p;}
friend inline std::ptrdiff_t operator -(const reverse_iterator & it1, const reverse_iterator & it2) {return it2.pos - it1.pos;}
friend inline reverse_iterator operator +(const reverse_iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;}
friend inline reverse_iterator operator +(size_t p, const reverse_iterator & it) {return it + p;}
inline bool operator ==(const reverse_iterator & it) const {return (pos == it.pos);} inline bool operator ==(const reverse_iterator & it) const {return (pos == it.pos);}
inline bool operator !=(const reverse_iterator & it) const {return (pos != it.pos);} inline bool operator !=(const reverse_iterator & it) const {return (pos != it.pos);}
friend inline bool operator <(const reverse_iterator & it1, const reverse_iterator & it2) {return it1.pos < it2.pos;}
friend inline bool operator <=(const reverse_iterator & it1, const reverse_iterator & it2) {return it1.pos <= it2.pos;}
friend inline bool operator >(const reverse_iterator & it1, const reverse_iterator & it2) {return it1.pos > it2.pos;}
friend inline bool operator >=(const reverse_iterator & it1, const reverse_iterator & it2) {return it1.pos >= it2.pos;}
}; };
class const_reverse_iterator { class const_reverse_iterator {
@@ -341,12 +365,31 @@ public:
inline const_reverse_iterator(): parent(0), pos(0) {} inline const_reverse_iterator(): parent(0), pos(0) {}
inline const T & operator *() const {return (*parent)[pos];} inline const T & operator *() const {return (*parent)[pos];}
inline void operator ++() {--pos;} inline const T & operator ->() const {return (*parent)[pos];}
inline void operator ++(int) {--pos;}
inline void operator --() {++pos;} inline const_reverse_iterator & operator ++() {--pos; return *this;}
inline void operator --(int) {++pos;} inline const_reverse_iterator & operator ++(int) {const auto tmp = *this; --*this; return tmp;}
inline const_reverse_iterator & operator --() {++pos; return *this;}
inline const_reverse_iterator & operator --(int) {const auto tmp = *this; ++*this; return tmp;}
inline const_reverse_iterator & operator +=(const const_reverse_iterator & it) {pos -= it.pos; return *this;}
inline const_reverse_iterator & operator +=(size_t p) {pos -= p; return *this;}
inline const_reverse_iterator & operator -=(const const_reverse_iterator & it) {pos += it.pos; return *this;}
inline const_reverse_iterator & operator -=(size_t p) {pos += p; return *this;}
friend inline const_reverse_iterator operator -(const const_reverse_iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;}
friend inline const_reverse_iterator operator -(size_t p, const const_reverse_iterator & it) {return it - p;}
friend inline std::ptrdiff_t operator -(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it2.pos - it1.pos;}
friend inline const_reverse_iterator operator +(const const_reverse_iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;}
friend inline const_reverse_iterator operator +(size_t p, const const_reverse_iterator & it) {return it + p;}
inline bool operator ==(const const_reverse_iterator & it) const {return (pos == it.pos);} inline bool operator ==(const const_reverse_iterator & it) const {return (pos == it.pos);}
inline bool operator !=(const const_reverse_iterator & it) const {return (pos != it.pos);} inline bool operator !=(const const_reverse_iterator & it) const {return (pos != it.pos);}
friend inline bool operator <(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it1.pos < it2.pos;}
friend inline bool operator <=(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it1.pos <= it2.pos;}
friend inline bool operator >(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it1.pos > it2.pos;}
friend inline bool operator >=(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it1.pos >= it2.pos;}
}; };
//! \~\brief //! \~\brief

View File

@@ -2,12 +2,12 @@
#include <algorithm> #include <algorithm>
int main(int argc, char * argv[]) { int main(int argc, char * argv[]) {
PIVector <int> v(5, [](size_t i){return i*2;}); PIVector <PIString> v(5, [](size_t i){return PIString::fromNumber(i*2);});
v.prepend({1, 2, 3}); v.prepend({"1", "02", "3"});
piCout << v; piCout << v;
for (auto i: v) piCout << i;
piCout << "sz" << v.end() - v.begin();
std::sort(v.begin(), v.end()); std::sort(v.begin(), v.end());
piCout << v; piCout << v;
std::sort(v.rbegin(), v.rend());
piCout << v;
return 0; return 0;
} }