爲了能夠使用基於範圍的,您的班級應提供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」。 –