为了能够使用基于范围的,您的班级应提供const_iterator begin() const
和const_iterator end() const
成员。你也可以重载全球begin
函数,但是在我看来,有一个成员函数更好。 iterator begin()
和const_iterator cbegin() const
也是推荐的,但不是必需的。如果你只是想遍历一个内部的容器,这是非常简单:
template< typename Type>
class SomeSortedContainer{
std::vector<Type> m_data; //we wish to iterate over this
//container implementation code
public:
typedef typename std::vector<Type>::iterator iterator;
typedef typename std::vector<Type>::const_iterator const_iterator;
iterator begin() {return m_data.begin();}
const_iterator begin() const {return m_data.begin();}
const_iterator cbegin() const {return m_data.cbegin();}
iterator end() {return m_data.end();}
const_iterator end() const {return m_data.end();}
const_iterator cend() const {return m_data.cend();}
};
如果你想遍历任何定制虽然,你可能必须设计自己的迭代器作为容器内的类。
class const_iterator : public std::iterator<random_access_iterator_tag, Type>{
typename std::vector<Type>::iterator m_data;
const_iterator(typename std::vector<Type>::iterator data) :m_data(data) {}
public:
const_iterator() :m_data() {}
const_iterator(const const_iterator& rhs) :m_data(rhs.m_data) {}
//const iterator implementation code
};
有关编写迭代器类的更多详细信息,请参阅my answer here。
如果您使用Visual Studio,则可以将鼠标悬停在变量的名称上以查看其类型。 IIRC,它显示了实际的类型,而不是“auto”。 –