1. 程式人生 > >常見的資料列舉遍歷方法

常見的資料列舉遍歷方法

BOOL EnumWindows(  WNDENUMPROC lpEnumFunc, LPARAM lParam );

(3)Index遍歷方法
該方法通過暴露2個API來實現,GetCount和GetItemByIndex,前者返回總的數量,後者根據索引返回某個Item。
我們通常實現的operator[](int nIndex)實際也是這種方法。

(4)COM裡IEnum方法
IEnum介面包含4個方法:
HRESULT Reset();  //重置到起始狀態
HRESULT Next(ULONG celt, XXX* ppGet, ULONG* fetched); //嘗試去取celt個元素
HRESULT Skip(ULONG celt); //跳過下面的celt個元素

HRESULT Clone(IEnumXXX** ppEnum); //克隆一個當前狀態的Enum介面
應該說IEnum介面對於我們的遍歷需求來說,它很完整也很強大。

(5)C#裡的IEnumerable和IEnumerator方法
如果一個類支援列舉,它會實現IEnumerable介面, IEnumerable介面就一個簡單的方法: IEnumerator GetEnumerator()
IEnumerator介面包含3個方法:
void Reset(); //重置
Object Current(); //取得當前物件
bool MoveNext(); //指向下一個物件,如果沒有下一個物件,返回False
可以看到C#的介面和COM的IEnum介面其實很類似。


(6)Iterator方法
這是STL的推薦方法, 我們知道Iterator在STL是容器和演算法的粘合劑, 也是讓演算法獨立於容器的隔離層。
我們可以通過STL的begin(), end(), operator++實現上面列舉方式的遍歷。
仔細觀察我們會發現iterator是比上面enum方式更高層次的抽象, Iterator支援InputIterator, OutputIterator, ForwardIterator, BidirectionalIterator, RandomAccessIterator, 而上面的IEnum實際上只是ForwardIterator的一種實現。

(7)C++11的foreach方法

C++11的foreach本質上也是iterator的一種封裝, 只要你的類符下面的規範,它就能支援foreach:
> 實現 begin()和end()方法
> 返回的Iterator支援operator*, operator!=, operator++
具體可以參考C++11 range-based for loops

最後簡單總結下,如果沒有特殊情況, 在C++程式設計中個人還是推薦儘量用Iterator的方式,因為這種方式可以更好的和STL演算法融合在一起。不知道大家還有沒有其他的遍歷方式?