From 60c9d600790b0ed9c972b9eb505c3c997221af18 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 7 Apr 2022 18:17:23 +0300 Subject: [PATCH] PIVector reverse_iterator sort --- libs/main/containers/pivector.h | 93 ++++++++++++++++++++++++--------- main.cpp | 8 +-- 2 files changed, 72 insertions(+), 29 deletions(-) diff --git a/libs/main/containers/pivector.h b/libs/main/containers/pivector.h index 0b71e48e..5a9f2e0a 100644 --- a/libs/main/containers/pivector.h +++ b/libs/main/containers/pivector.h @@ -231,13 +231,15 @@ public: typedef std::random_access_iterator_tag iterator_category; inline iterator(): parent(0), pos(0) {} + inline T & operator *() {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 --() {--pos; return *this;} + inline iterator & operator --() {--pos; return *this;} inline iterator & operator --(int) {const auto tmp = *this; --*this; return tmp;} inline iterator & operator +=(const iterator & it) {pos += it.pos; return *this;} @@ -245,12 +247,12 @@ public: inline iterator & operator -=(const iterator & it) {pos -= it.pos; return *this;} inline iterator & operator -=(size_t p) {pos -= p; return *this;} - 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 size_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 -(size_t p, const iterator & it) {return it - p;} + 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+(size_t p, const iterator & it) {return it + p;} + 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;} inline bool operator ==(const iterator & it) const {return (pos == it.pos);} inline bool operator !=(const iterator & it) const {return (pos != it.pos);} @@ -274,12 +276,13 @@ public: typedef std::random_access_iterator_tag iterator_category; inline const_iterator(): parent(0), pos(0) {} - inline const T & operator *() const {return (*parent)[pos];} - inline const T & operator->() {return (*parent)[pos];} - inline const_iterator & operator ++() {++pos; return *this;} + inline const T & operator *() const {return (*parent)[pos];} + inline const T & operator ->() const {return (*parent)[pos];} + + inline const_iterator & operator ++() {++pos; return *this;} inline const_iterator & operator ++(int) {const auto tmp = *this; ++*this; return tmp;} - 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 +=(const const_iterator & it) {pos += it.pos; return *this;} @@ -287,12 +290,12 @@ public: inline const_iterator & operator -=(const const_iterator & it) {pos -= it.pos; return *this;} inline const_iterator & operator -=(size_t p) {pos -= p; return *this;} - 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 size_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 -(size_t p, const const_iterator & it) {return it - p;} + 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+(size_t p, const const_iterator & it) {return it + p;} + 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;} inline bool operator ==(const const_iterator & it) const {return (pos == it.pos);} inline bool operator !=(const const_iterator & it) const {return (pos != it.pos);} @@ -316,14 +319,35 @@ public: typedef std::random_access_iterator_tag iterator_category; inline reverse_iterator(): parent(0), pos(0) {} + inline T & operator *() {return (*parent)[pos];} inline const T & operator *() const {return (*parent)[pos];} - inline void operator ++() {--pos;} - inline void operator ++(int) {--pos;} - inline void operator --() {++pos;} - inline void operator --(int) {++pos;} + inline T & operator ->() {return (*parent)[pos];} + inline const T & operator ->() const {return (*parent)[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);} + 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 { @@ -341,12 +365,31 @@ public: inline const_reverse_iterator(): parent(0), pos(0) {} inline const T & operator *() const {return (*parent)[pos];} - inline void operator ++() {--pos;} - inline void operator ++(int) {--pos;} - inline void operator --() {++pos;} - inline void operator --(int) {++pos;} + inline const T & operator ->() const {return (*parent)[pos];} + + 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 --() {++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);} + 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 diff --git a/main.cpp b/main.cpp index fd92fbcd..4f3d7c12 100644 --- a/main.cpp +++ b/main.cpp @@ -2,12 +2,12 @@ #include int main(int argc, char * argv[]) { - PIVector v(5, [](size_t i){return i*2;}); - v.prepend({1, 2, 3}); + PIVector v(5, [](size_t i){return PIString::fromNumber(i*2);}); + v.prepend({"1", "02", "3"}); piCout << v; - for (auto i: v) piCout << i; - piCout << "sz" << v.end() - v.begin(); std::sort(v.begin(), v.end()); piCout << v; + std::sort(v.rbegin(), v.rend()); + piCout << v; return 0; }