własny iterator

0

Witam.
Mam problem z napisaniem własnego iteratora do napisanej szablonowej klasy typu wektor, przechowującej inne obiekty.
Szukając informacji i przykładów o iteratorze, w większości przypadków natrafiałem na wykorzystywanie iteratotra dla gotowej klasy Vector. Cięzko było znaleźć informacje o pisaniu własnego iteratora. Znalazłem co prawda jeden przykład, ale klasa, po której poruszał się iterator, działała na zasadzie listy jednokierunkowej. Moja klasa wektorowa korzysta natomiast z tablicy dynamicznej, przez co nie moge przenieść kodu z przykładu na mój.

Moje pytanie brzmi, czy da się w ogóle zaimplementować iterator swobodnego dostępu do stworzonej przeze mnie klasy?
Prosiłbym również o jakieś wskazówki dla początkującego, którym jestem, jak utworzyć wspomniany iterator.

Poniżej zamieszczam kod mojej klasy wektorowej:

#ifndef VECTORCLASS_H_
#define VECTORCLASS_H_

#include <iostream>
#include "ProductClass.h"

template <typename Type>
class VectorClass {
private:
    int vectorsize_;
    Type *table_;
    int top_;
public:
    VectorClass();
    explicit VectorClass(int s);
    VectorClass(const VectorClass & vc);    //konstruktor kopiujący
    virtual ~VectorClass();
    int push(const Type & item);
    int push(const Type & item, int place);
    void print();
};

#endif /* VECTORCLASS_H_ */

//**************************************************************************************


template <typename Type>
VectorClass<Type>::VectorClass() : vectorsize_(3), top_(0) {
    table_ = new Type[3];
}

template <typename Type>
VectorClass<Type>::VectorClass(int s) : vectorsize_(s), top_(0) {
    table_ = new Type[s];
}


//konstruktor kopiujący
template <typename Type>
VectorClass<Type>::VectorClass(const VectorClass & vc){
    vectorsize_ = vc.vectorsize_;
    top_ = vc.top_;
    table_ = new Type[vectorsize_];
    for (int i = 0; i < vectorsize_; i++){
        table_[i] = vc.table_[i];
    }
}

template <typename Type>
VectorClass<Type>::~VectorClass() {
    delete [] table_;
}

template <typename Type>
int VectorClass<Type>::push(const Type & item)
{
    if (top_ > vectorsize_ - 1){
        VectorClass temp(*this);
        vectorsize_ += 3;
        table_ = new Type[vectorsize_];

        for (int i = 0; i < temp.vectorsize_; i++)
            table_[i] = temp.table_[i];
    }

    table_[top_] = item;
    top_++;

    return 0;
}

template <typename Type>
int VectorClass<Type>::push(const Type & item, int place)
{
    if (place + 1 > vectorsize_ -1 ){
        VectorClass temp(*this);
        vectorsize_ += 3;
        table_ = new Type[vectorsize_];

        for (int i = 0; i < temp.vectorsize_; i++)
            table_[i] = temp.table_[i];
    }
    table_[place] = item;
    if (place == top_)
        top_++;

    return 0;
}

template <typename Type>
void VectorClass<Type>::print()
{
    for (int i = 0; i <= vectorsize_ - 1; i++){
        table_[i].print();
    }
} 
1

W przypadku takiej tablicy wystarczy w części publicznej dać:

typedef Type *iterator;
iterator begin() { return table_; }
iterator end() { return table_+vectorsize_; }
0

Dzięki za pomoc. O to mi chodziło.
A czy mógłbym jeszcze uzyskać jakieś wskazówki odnośnie przeładowania operatora inkrementacji dla tego iteratora?
Nie mogę sobie sam z tym poradzić.

0

Dla tego iteratora nic już więcej nie musisz robić.
Co innego dla reverse_iteratora

0

a jeśli chciałbym użyć iteratora do wypisywania wektora za pomocą funkcji: for ( ...;...;iterator++)?
Ma tutaj w ogóle sens bawienie się z iteratorem, czy lepiej zrobić to bez niego?
Jest to mój pierwszy kontakt z iteratorami, i nie potrafię się jeszcze nimi obsługiwać.

0

Więc zacząłeś od d**py strony, najpierw masz zrozumieć co to jest iterator i z czym to się je a po tym dopiero próbować go zrealizować.

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