Как я могу определить итератор и const_iterator в моем классе, когда я использую std :: vector в качестве поля в моем классе? - PullRequest
0 голосов
/ 03 июля 2018

Дан следующий класс:

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);   
};

Как я могу определить iterator и const_iterator для моего класса? ( Я хочу использовать итераторы векторов вместо реализации class iterator и class const_iterator) ..


Я хочу (например) поддержать что-то в этом роде:

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

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы можете просто сделать это в 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++) { /* .. */ 
}

И на основе диапазона для цикла:

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

Дополнительные пояснения о том, как поддерживать циклический цикл for, доступны здесь: Как настроить мой пользовательский тип для работы с циклическим циклом?

(спасибо @JohnML за предложение отредактировать ответ, совместимый с c ++ 11!)

0 голосов
/ 03 июля 2018

Просто введите существующие типы итераторов вектора в свой собственный класс:

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;
    ...
};
...