当我在类中使用std :: vector作为字段时,如何在类中定义迭代器和const_iterator?

时间:2018-07-03 07:25:33

标签: c++ class c++11 vector iterator

给出以下类别:

template<class T>
class A {
    vector<T> arr;
public:
    A(int size);
    A(vector<T> arr);
    int size() const;
    A& operator=(const A& p);

    template<class S>
    friend ostream& operator<<(ostream& os, const A<S>& p);

    template<class S>
    friend bool operator==(const A<S>& p1, const A<S>& p2);   
};

如何为我的班级定义iteratorconst_iterator? (我想使用向量的迭代器来实现class iteratorclass const_iterator )。


例如,我希望提供以下支持:

A a(5);  
for(A<int>::iterator it = a.begin() ; it != a.end() ; it++) { /* .. */ }

2 个答案:

答案 0 :(得分:3)

您可以在C ++ 11中简单地做到这一点:

template<class T>
class A {
    vector<T> arr;
public: 

    using iterator = typename vector<T>::iterator;
    using const_iterator = typename vector<T>::const_iterator;

    const_iterator begin() const { return arr.begin(); }
    iterator       begin()       { return arr.begin(); }
    const_iterator end() const { return arr.end(); }
    iterator       end()       { return arr.end(); }
};

或在C ++ 14中:

template<class T>
class A {
    vector<T> arr;
public:
    using iterator = typename vector<T>::iterator;
    using const_iterator = typename vector<T>::const_iterator;

    auto begin() const { return arr.begin(); }
    auto begin()       { return arr.begin(); }
    auto end() const { return arr.end(); }
    auto end()       { return arr.end(); }
};

然后,您都可以支持基于迭代器的迭代:

A<int> a(5);  
for(A<int>::iterator it = a.begin() ; it != a.end() ; it++) { /* .. */ 
}

基于范围的for循环:

A a(5);  
for(auto v : a) { /* .. */ 
}

此处提供有关如何支持基于范围的for循环的更多说明:How to make my custom type to work with "range-based for loops"?

(感谢@JohnML的编辑建议,使答案符合c ++ 11!)

答案 1 :(得分:1)

只需将向量的现有迭代器类型类型定义为您自己的类:

template<class T>
class A {
    ...
public:
    typedef vector<T>::iterator iterator;
    typedef vector<T>::const_iterator const_iterator;
    ...
};

template<class T>
class A {
    ...
public:
    using iterator = typename vector<T>::iterator;
    using const_iterator = typename vector<T>::const_iterator;
    ...
};