首页 > 解决方案 > 在 C++ 中使用带有自定义向量的迭代器

问题描述

我创建了一个自定义向量,我想为其创建一个迭代器,我已将代码简化为一个简约版本,只剩下一个错误。我想修复那个错误,然后让代码做它应该做的事情,即打印数组元素的总和。

这是代码:

#include <iostream>
using namespace std;



template <class Elem>
class ArrayVector{
    public :
        ArrayVector(){
            A = new Elem[3];
            A[0] = 1;
            A[1] = 2;
            A[3] = 3;
            ptr = &A[0];
        }
        const ArrayVector * begin(){
            this->begin();
        }
    class iteratorArray{
            Elem * current;
            const ArrayVector * begin(){
                return iteratorArray();
            }
            const ArrayVector* end(){  
                iteratorArray* end = new iteratorArray(&current[3]);
                return end;
            }
            iteratorArray(Elem* initLoc){
                current = initLoc;
            }
            iteratorArray operator+(int n){
                current = &current[n];
                return *this;
            }
            bool operator!=(iteratorArray& obj2){
                return this->current != obj2.current;
            }
            iteratorArray operator++(){
                current = current+1;
                return *this;
            }
            Elem& operator*(){
                return *current;
            }
    };
    Elem* A;
    Elem* ptr;
};


int main() {
    ArrayVector<int> vector1;
    typedef ArrayVector<int>::iteratorArray iteratorArray;  
    int sum = 0;
    for (iteratorArray p = vector1.begin(); p != vector1.end(); ++p)
        sum += *p;
    return sum;
}

标签: c++arraysvectoriterator

解决方案


你实现了你的iteratorArray一切都错了。它应该看起来更像这样:

#include <iostream>

template <class Elem>
class ArrayVector{
private:
    Elem* A;

public :
    ArrayVector(){
        A = new Elem[3];
        A[0] = 1;
        A[1] = 2;
        A[2] = 3;
    }

    ArrayVector(const ArrayVector &src){
        A = new Elem[3];
        A[0] = src.A[0];
        A[1] = src.A[1];
        A[2] = src.A[2];
    }

    ~ArrayVector(){
        delete[] A;
    }

    ArrayVector& operator=(const ArrayVector &rhs){
        A[0] = rhs.A[0];
        A[1] = rhs.A[1];
        A[2] = rhs.A[2];
        return *this;
    }

    class iterator {
    private:
        Elem * current;

    public:
        iterator(Elem* initLoc){
            current = initLoc;
        }

        iterator operator+(int n) const {
            return iterator(current + n);
        }

        iterator operator-(int n) const {
            return iterator(current - n);
        }

        iterator& operator++(){
            ++current;
            return *this;
        }

        iterator operator++(int){
            return iterator(current++);
        }

        iterator& operator--(){
            --current;
            return *this;
        }

        iterator operator--(int){
            return iterator(current--);
        }

        iterator& operator+=(int n){
            current += n;
            return *this;
        }

        iterator& operator-=(int n){
            current -= n;
            return *this;
        }

        bool operator!=(const iterator& rhs) const{
            return current != rhs.current;
        }

        Elem& operator*(){
            return *current;
        }

        // and so on for other operators that a RandomAccess iterator needs to implement...
    };

    iterator begin(){
        return iterator(A);
    }

    iterator end(){
        return iterator(A+3);
    }
};

int main() {
    ArrayVector<int> vector1;
    typedef ArrayVector<int>::iterator iteratorArray;  
    int sum = 0;
    for (iteratorArray p = vector1.begin(); p != vector1.end(); ++p)
        sum += *p;
    std::cout << sum;
    return 0;
}

现场演示

也就是说,你根本不需要定制iterator。您可以只使用原始指针,它们是完全有效的迭代器。ArrayVector::begin()可以返回A并且ArrayVector::end()可以返回A+3

#include <iostream>

template <class Elem>
class ArrayVector{
private:
    Elem* A;

public :
    ArrayVector(){
        A = new Elem[3];
        A[0] = 1;
        A[1] = 2;
        A[2] = 3;
    }

    ArrayVector(const ArrayVector &src){
        A = new Elem[3];
        A[0] = src.A[0];
        A[1] = src.A[1];
        A[2] = src.A[2];
    }

    ~ArrayVector(){
        delete[] A;
    }

    ArrayVector& operator=(const ArrayVector &rhs){
        A[0] = rhs.A[0];
        A[1] = rhs.A[1];
        A[2] = rhs.A[2];
        return *this;
    }

    typedef Elem* iterator;

    iterator begin(){
        return A;
    }

    iterator end(){
        return A+3;
    }
};

int main() {
    ArrayVector<int> vector1;
    typedef ArrayVector<int>::iterator iteratorArray;  
    int sum = 0;
    for (iteratorArray p = vector1.begin(); p != vector1.end(); ++p)
        sum += *p;
    std::cout << sum;
    return 0;
}

现场演示


推荐阅读