problem z własnym iteratorem

Odpowiedz Nowy wątek
oranje
2012-06-11 12:40
oranje
0

Witam,

Mam spory problem z napisaniem własnego iteratora w ćwiczeniu.
O ile rozumiem ogólną ideę, metody, tak własna implementacja sprawia mi spory problem - a nie mogę znaleźć nigdzie dobrze wytłumaczonego tego tematu.

#ifndef VECTOR_HPP
#define VECTOR_HPP

/**
 * Generic vector (array) with fixed size
 */
template<class T, int n>
class Vector {
    T v[n];                
    int siz;                
public:
    Vector() { siz = 0; }

    void push_back(T e) {
        if (siz >= n) throw "Vector is full";
        v[siz++] = e;
    }

    T& operator[](int i) {
        if (i < 0 || i >= siz) throw "Index error";
        return v[i];
    }
    class Iterator;
    Iterator begin(){return Iterator(*this);}
    Iterator end(){return Iterator(*this,siz);}
    class Iterator
    {
        private:
            T* act;
            T* last;
        public:
            Iterator() :act(0), last(0) {} 
            Iterator(Vector &st) :act(st.v), last(st.v+st.siz) {} /
            Iterator(Vector &st, int) :act(st.v+st.siz), last(st.v+st.siz) {} 
            Iterator& operator++()
            { // pre increment
                if (act != last) ++act;
                return act;
            }
            Iterator operator++(int)
            { // post increment
                Iterator tmp = *this;
                ++*this;
                return this;
            }

            bool operator!=(const Iterator &i)
            { 
                if(act==i)return true; //nie wiem jak to zrobić
                else return false;
            }

            T& operator*()
            { 
                if (act != 0 && act != last)
                return act;
            }

    };
};
#endif

Kod do sprawdzenia działania:

 #include <iostream>
#include "vector.hpp"
using namespace std;

int main() {

        Vector<int, 20> v1;             // int vector with a maximum size of 20.

    for (int i = 0; i < 10; i++)    // fill with elements
        v1.push_back(i);

    Vector<int, 20>::Iterator i1;   // create an iterator

    for (i1 = v1.begin(); i1 != v1.end(); i1++)    // print the elements
        cout << *i1 << endl;

    return 0;

Będę bardzo wdzięczny za jakiekolwiek uwagi - zwyczajnie nie wiem jak to ugryźć.

Pozostało 580 znaków

2012-06-11 13:00

Rejestracja: 14 lat temu

Ostatnio: 1 dzień temu

0
#include <iostream>
using namespace std;

template<class T, unsigned n> class Vector
  {
   T v[n];
   unsigned siz;                
   public:
   Vector():siz(0) {}

   void push_back(const T &e)
     {
      if(siz>=n) throw "Vector is full";
      v[siz++]=e;
     }

   const T &pop_back(const T &e)
     {
      if(siz<1) throw "Vector is full";
      return v[--siz];
     }

   T& operator[](unsigned i)
     {
      if(i>=siz) throw "Index error";
      return v[i];
     }

   class iterator
     {
      private:
      T *P;
      public:
      typedef input_iterator_tag iterator_category;
      typedef T value_type;
      typedef int difference_type;
      typedef T *pointer;
      typedef T &reference;
      iterator(T *P=0):P(P) {}
      bool operator==(const iterator &I)const { return P==I.P; }
      bool operator!=(const iterator &I)const { return P!=I.P; }
      bool operator<(const iterator &I)const { return P<I.P; }
      bool operator>(const iterator &I)const { return P>I.P; }
      bool operator<=(const iterator &I)const { return P<=I.P; }
      bool operator>=(const iterator &I)const { return P>=I.P; }
      int operator-(const iterator &I)const { return P-I.P; }
      iterator &operator++() { ++P; return *this; }
      iterator operator++(int) { iterator r(P); ++P; return r; }
      iterator &operator--() { --P; return *this; }
      iterator operator--(int) { iterator r(P); --P; return r; }
      T &operator*() { return *P; }
      T *operator->() { return P; }
     };
   iterator begin() { return iterator(v); }
   iterator end() { return iterator(v+siz); }
  };

int main()
  {
   Vector<int,20> v1;             // int vector with a maximum size of 20.

   for(int i=0;i<10;++i) v1.push_back(i);  // fill with elements
   Vector<int,20>::iterator i1;        // create an iterator
   for(i1=v1.begin();i1!=v1.end();++i1) cout<<*i1<<endl;   // print the elements
   cout<<endl;
   for(Vector<int,20>::iterator i=v1.begin();i<v1.end();++i) cout<<*i<<endl;   // print the elements

   cin.sync(); cin.get();
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
a co jak ktos bedzie chcial wyluskac vec[-5] xD zwroci mu cos ;) - Krycho 2012-06-11 18:50
Nie, będzie: throw "Index error"; - _13th_Dragon 2012-06-11 20:47
Ajjj no racja unsigned ;) Nie pomyslalem. - Krycho 2012-06-11 21:22

Pozostało 580 znaków

oranje
2012-06-12 15:26
oranje
0

Wielkie dzięki. Wszystko jasne. Nie musiałeś dopisywać dodatkowych metod - to już sam bym ogarnął :)

Pozostało 580 znaków

2012-06-12 15:41

Rejestracja: 16 lat temu

Ostatnio: 3 godziny temu

0
_13th_Dragon napisał(a)
class iterator
...
};

a nie wystarczy po prostu

typedef T* iterator;

? ;-)

W przypadku takiej klasy owszem - ale z kodu wywnioskowałem że @oranje chce to zrobić "na całość". I nawet mi się nie pomyślało że autor tematu może nie wiedzieć że to wystarczy w tym przypadku, dopiero jak napisałeś przemknęło mi to przez myśl. ;] - _13th_Dragon 2012-06-12 16:18

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0