C++用for遍歷自定義類

正確的做法是像STL容器那樣,創建一個迭代器類,然後裏面重載 !=(比較), ++(遞增),*(解引用) 這幾個函數。

例如:

template <class T>
class iterator {
private:
	T* _data;
protected:
public:
	// 構造函數,傳進迭代器管理的值
	iterator(T* data_) :
	_data(data)
	{}
	
	bool operator !=(const iterator& that) {
		// 比較實現, 例如:
		return _data == &that;
	}
	
	iterator& operator ++() {
		// 自增實現, 例如:
		_data = _data->next;
		return *this;
	}
	
	T& operator *() {
		// 解引用, 例如:
		return *_data;
	}
	
	iterator(const iterator&) = delete;
	iterator& operator =(const iterator&) = delete;
	~iterator() = default;
}

光是這樣還不夠,還得在我麼要遍歷的類中添加begin和end兩個函數,begin和end返回什麼呢?我給大家舉個例子,一個數組char a[5],begin代表了第一個元素,即a[0], end代表最後一個元素的後一位,即a[5],我們只需要把begin和end函數內返回我們提前指定好這兩個元素的迭代器就行了,例:

class A {
private:
	iterator<A> _begin;	// 第一個元素
	iterator<A> _end;	// 最後一個元素後一位
protected:
public:
	iterator<A>& begin() {
		// 這裏可以動態更新 _begin 代表的值,再返回 _begin
		return _begin;
	}
	
	iterator<A>& end() {
		// 這裏可以動態更新 _end 代表的值,再返回 _end
		return _end;
	}
}

之後我們就可以使用 for (auto& i : xxx) 遍歷這個類型的變量了,最後和大家說一下,如果begin和end是返回指針的話可以不用迭代器類就可以,因爲指針的 !=(比較), ++(自增),*(解引用)這幾個函數都是C++語言內置的。前提是你遍歷的數據是連續內存,這樣通過++(自增)獲取的下個值纔是正確的,不然你還是得額外寫一個迭代器類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章