Czy w podanym kodzie jest potrzebny iterator?

0

Witam jestem studentem, nie jestem programista.
Chciałem się zapytać czy w podanym szablonie klasy jest sens robić iterator w innym celu niż pokazanie jak on działa ?

Możliwe, że czegoś nie zauważam.

Z góry dziękuję za odpowiedź.

 
#include <iostream>
using namespace std;

template <typename T>
class Table{
public:
    Table(T* b,T* e):s(e-b),tab(new T[e-b]) 
    {
      T* pocz = tab;
      while(b!=e)
      {
        *pocz = *b;
        ++pocz;++b;
      }
}
    Table(const Table& t):s(t.s),tab(new T[t.s])  
    {
      for(unsigned i= 0 ; i< s;++i)
      {
        tab[i]=t.tab[i];
      }
    }
    Table& operator=(const Table& t)
    {
      if(this!=&t)
      {
        delete tab;
        s=t.s;
        tab = new T[s];
        for(unsigned i= 0 ; i< s;++i)
          tab[i]=t.tab[i];
      }
      return *this;
    }

~Table(){
    delete[] tab;//Wersja dla tablic
}
class Iterator{
public:
    Iterator(T* wsk):w(wsk){}
    Iterator& operator++(){
        ++w;
        return *this;
    }
    Iterator operator++(int){
      Iterator temp(*this);
      ++(*this);
      return temp;
    }
    T& operator*()
    {
      return *w;
    }
    T* operator->(){
        return w;
    }
    bool operator!=(const Iterator& i)const{
        return w != i.w;
    }

private:
    T* w;

};
  Iterator begin()
  {
    return Iterator(tab);
  }
  Iterator end(){
    return Iterator(tab+s);
  }


private:
  unsigned s;
  T* tab;

};

int main()
{
  int tab[] = {1, 3, 4, 8};

  Table<int> vec(tab, tab + 4);
  for(Table<int>::Iterator iter = vec.begin(); iter != vec.end();++iter)
  cout << *iter << endl;
  Table<int> vec2(vec);
  for(Table<int>::Iterator iter = vec2.begin(); iter != vec2.end();iter++)
  {
    *iter = 1;
    cout << *iter << endl;
  }
  for(Table<int>::Iterator iter = vec.begin(); iter != vec.end();++iter)
  cout << *iter << endl;
}
7

Wskaźnik też spełnia wymagania iteratora, więc dla własnej, bardziej upośledzonej implementacji wektora faktycznie można użyć po prostu wskaźnika.

Przy okazji:

  1. fatalne formatowanie kodu. http://format.krzaq.cc jak sam nie umiesz
  2. nie używaj nagiego new i delete. Masz mądre wskaźniki, masz kontenery (ok, w zadaniu gdzie masz zaimplementować własny to pewnie to ostatnie akurat odpada)
  3. używaj algorytmów zamiast pętli (copy zamiast pętli kopiującej) - polecam https://channel9.msdn.com/Events/GoingNative/2013/Cpp-Seasoning
0

W tym iteratorze chyba trochę brakuje, żeby go używać w algorytmach (np. copy).
M.in. konstruktora kopiującego i przypisania.

http://stackoverflow.com/questions/8054273/how-to-implement-an-stl-style-iterator-and-avoid-common-pitfalls

1

Nie do końca. Nie ma co prawda traitsów, ale operator = i konstruktor kopiujący zostaną wygenerowane automatycznie, a ten iterator to tylko obserwator, niewiele różniący się od T*.

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