C++ iterator для своего контейнера

296
24 апреля 2017, 04:56

Здравствуйте! Я написал свой класс-контейнер. И теперь мне нужно написать класс iterator, чтобы мой контейнер смог взаимодействовать с алгоритмами стандартной библиотеки. Написал класс:

class Iterator {
public:
    Iterator(T *first) {
        current = first;
    }
    T &operator+(int n) {
        return *(current + n);
    }
    T &operator-(int n) {
        return *(current - n);
    }
    T &operator++(int) {
        return *current++;
    }
    T &operator--(int) {
        return *current--;
    }
    T &operator++() {
        return *++current;
    }
    T &operator--() {
        return *--current;
    }
    bool operator==(const Iterator &it) {
        return current == it.current;
    }
    bool operator!=(const Iterator &it) {
        return current != it.current;
    }
    T &operator*() {
        return *current;
    }
private:
    T *current;
};

Код в main:

Array<int> arr;
Array<int> arr2;
for (int i(160); i >= 0; i -= 5)
{
    arr.append(i);
}
for (int i(0); i < 180; i += 5)
{
    arr2.append(i);
}
sort(arr.begin(), arr.end());

В итоге получаю несколько ошибок при сборке:

error C2679: бинарный "-": не найден оператор, принимающий правый операнд типа "Array::Iterator" (или приемлемое преобразование отсутствует)

error C2780: void std::_Sort(_RanIt,_RanIt,_Diff,_Pr): требует аргументов: 4, имеется: 3

Answer 1

Не знаю, что у вас неправильно в append, но итератор реализован неправильно. Бинарные операторы + и - должны возвращать новый итератор, а не объект типа Т, аналогично с операторами ++ и --. Скорее всего, должно быть примерно так :

class Iterator {
public:
    explicit Iterator(T *first): current(first) {
    }
    Iterator operator + (int n) const{
        return Iterator(current + n);
    }
    Iterator operator++(int) {
        Iterator tmp(current++);
        return tmp;
    }
    Iterator& operator++() {
        ++current
        return *this;
    }
    Iterator operator - (int n) const{
        return Iterator(current - n);
    }
    Iterator operator--(int) {
        Iterator tmp(current--);
        return tmp;
    }
    Iterator& operator--() {
        --current
        return *this;
    }
    bool operator==(const Iterator &it) const{
        return current == it.current;
    }
    bool operator!=(const Iterator &it) const{
        return !(*this == it);
    }
    T &operator*() {
        return *current;
    }
    const T &operator*() const{
        return *current;
    }
private:
    T *current;
};

P.S. И про const не забывайте.

READ ALSO
Структуры с++ Visual Studio

Структуры с++ Visual Studio

Создал стуктуруВвожу 2 элемента f

220
Проблема с CLion, Makefile

Проблема с CLion, Makefile

При попытки собрать проект, я поучаю следующую ошибку

475
Ускорение обработки изображений OpenCV

Ускорение обработки изображений OpenCV

История такаяВ программе понадобился урезанный редактор для изображений, в котором есть ползунки, меняющие значение для гаммы, контраста...

370