Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Własny Random Access Iterator

Ostatnio zmodyfikowano 2017-04-06 21:13
Autor Wiadomość
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.

C/C++
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 ); //external,done
    CustomContainer( size_type size, T value ); //external,done
    CustomContainer( const CustomContainer & cc ); //external,done
    template < typename Iter >
    CustomContainer( Iter begin, Iter end ); //external,done
    template < typename Iter >
    CustomContainer( size_type size, Iter item ); //external,done
    ~CustomContainer(); //external,done
   
    bool push_back( T value ); //external,done
    bool push_front( T value ); //external,done
    bool pop_back(); //external,done
    bool pop_front(); //external,done
   
    static int getTotalObj() { return total_objects; }
    size_type getContainerSize() { return items; }
    bool isFull() { if( check == TRUE_BIT ) return true; else return false; }
   
    //Overloaded operators
    CustomContainer & operator =( const CustomContainer & cc ); //external,done
   
    T & operator []( int n ); //external,done
    const T & operator []( int n ) const; //external,done
   
    bool operator ==( const CustomContainer & cc ); //external
    bool operator !=( const CustomContainer & cc ); //external
    bool operator <( const CustomContainer & cc ); //external
    bool operator >( const CustomContainer & cc ); //external
    bool operator <=( const CustomContainer & cc ); //external
    bool operator >=( const CustomContainer & cc ); //external
   
    //Iterator
    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() { }
       
        //boolean operators
        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_ ); }
       
        //other operators
        Iterator & operator =( const Iterator & i ); //external
        T & operator *(); //external
        Iterator & operator ++(); //external
        Iterator & operator ++( int ); //external
        Iterator & operator --(); //external
        Iterator & operator --( int ); //external
        Iterator operator +( ptrdiff_t n ); //external
        Iterator operator -( ptrdiff_t n ); //external
        Iterator & operator +=( ptrdiff_t n ); //external
        Iterator & operator -=( ptrdiff_t n ); //external
        ptrdiff_t operator -( const Iterator & i ); //external
        Iterator & operator []( ptrdiff_t n ); //external
    };
   
    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.

P-159862
michal11
» 2017-04-06 09:59:38
A problem masz z czym konkretnie?
P-159864
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.
P-159865
j23
» 2017-04-06 10:41:46
.
P-159867
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.
P-159872
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.
P-159877
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.
P-159902
Monika90
» 2017-04-06 19:32:45
C/C++
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.
P-159903
« 1 » 2
  Strona 1 z 2 Następna strona