Mati1919 Temat założony przez niniejszego użytkownika |
Własny Random Access Iterator » 2017-04-06 09:56:49 Witam, mam następujący problem, napisałem własną strukturę danych po której można się swobodnie poruszać dodawać nowe wartości na koniec i początek a także je usuwać. Chciałem też napisać własny iterator swobodny abym mógł korzystać z funkcji typu sort i copy. class Iterator;
template < typename T > class CustomContainer { friend class Iterator; public: private: enum ERROR_BIT { FALSE_BIT, TRUE_BIT }; struct Node { T item; struct Node * next; struct Node * previous; }; Node * front; Node * rear; static int total_objects; size_type items; ERROR_BIT check; public: CustomContainer() : items( 0 ) , front( nullptr ) , rear( nullptr ) , check( FALSE_BIT ) { total_objects++; } CustomContainer( size_type size ); CustomContainer( size_type size, T value ); CustomContainer( const CustomContainer & cc ); template < typename Iter > CustomContainer( Iter begin, Iter end ); template < typename Iter > CustomContainer( size_type size, Iter item ); ~CustomContainer(); bool push_back( T value ); bool push_front( T value ); bool pop_back(); bool pop_front(); static int getTotalObj() { return total_objects; } size_type getContainerSize() { return items; } bool isFull() { if( check == TRUE_BIT ) return true; else return false; } CustomContainer & operator =( const CustomContainer & cc ); T & operator []( int n ); const T & operator []( int n ) const; bool operator ==( const CustomContainer & cc ); bool operator !=( const CustomContainer & cc ); bool operator <( const CustomContainer & cc ); bool operator >( const CustomContainer & cc ); bool operator <=( const CustomContainer & cc ); bool operator >=( const CustomContainer & cc ); class Iterator : public std::iterator < std::random_access_iterator_tag, Node, ptrdiff_t, Node *, Node &> { private: Node * ptr_; public: Iterator( CustomContainer < T >::Node * ptr = nullptr ) : ptr_( ptr ) { } Iterator( const Iterator & i ) = default; ~Iterator() { } bool operator ==( const Iterator & i ) { return( ptr_ == i.ptr_ ); } bool operator !=( const Iterator & i ) { return( ptr_ != i.ptr_ ); } bool operator <( const Iterator & i ) { return( ptr_ < i.ptr_ ); } bool operator >( const Iterator & i ) { return( ptr_ > i.ptr_ ); } bool operator <=( const Iterator & i ) { return( ptr_ <= i.ptr_ ); } bool operator >=( const Iterator & i ) { return( ptr_ >= i.ptr_ ); } Iterator & operator =( const Iterator & i ); T & operator *(); Iterator & operator ++(); Iterator & operator ++( int ); Iterator & operator --(); Iterator & operator --( int ); Iterator operator +( ptrdiff_t n ); Iterator operator -( ptrdiff_t n ); Iterator & operator +=( ptrdiff_t n ); Iterator & operator -=( ptrdiff_t n ); ptrdiff_t operator -( const Iterator & i ); Iterator & operator []( ptrdiff_t n ); }; Iterator begin() { return front; } Iterator end() { return rear->next; } }; Definicji funkcji nie wklejam bo jest zbyt obszerna jednak jeśli któraś będzie potrzebna to nie ma sprawy. |
|
michal11 |
» 2017-04-06 09:59:38 A problem masz z czym konkretnie? |
|
Mati1919 Temat założony przez niniejszego użytkownika |
» 2017-04-06 10:04:34 Kiedy chcę użyć przykładowo funkcji sort i jako jej argumenty podaje a.begin() i a.end() dla CustomContainer<int> a to zasypuje mnie ogrom błędów typu No matching function for call to object of type 'std::_1::_less<CustomContainer<int>::Node,CustomContainer<int>::Node>'
EDIT: Dodam, że każda funkcja była przetestowana i działa tak jak powinna. |
|
j23 |
» 2017-04-06 10:41:46 . |
|
mokrowski |
» 2017-04-06 12:19:01 @Mati1919, błąd sugeruje (bo całego kodu nie widzę) że wywołałeś sort(..) z podaniem jedynie begin() i end() i bez funkcji komparatora. Wtedy wybierany jest domyślnie std::less który próbuje porównać elementy wyłuskane z iteratorów. Najprościej... dodaj jako 3 argument w sort(...) lambdę porównującą poprawnie Node lub zaimplementuj less dla Node. |
|
Mati1919 Temat założony przez niniejszego użytkownika |
» 2017-04-06 12:59:11 Rzeczywiście, spróbuje to zrobić jak wrócę do domu. |
|
Mati1919 Temat założony przez niniejszego użytkownika |
» 2017-04-06 19:26:45 Wróciłem, chciałem to zrobić i pierwsze co rzuciło mi się w oczy to wyłuskanie dla klasy iteratora powoduje zwrócenie wartośći typu T co w tym przypadku, który napisałem wyżej oznacza int. |
|
Monika90 |
» 2017-04-06 19:32:45 class Iterator : public std::iterator < std::random_access_iterator_tag, Node, ptrdiff_t, Node *, Node &> A tu masz Node, a nie T. Poza tym, std::iterator został niedawno zdeprecjonowany. |
|
« 1 » 2 |