给出以下类别:
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++) { /* .. */ }
答案 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;
...
};