什么是Iterator?
iterator的概念源自于對(duì)遍歷一個(gè)線性容器工具的抽象,即如何你能訪問(wèn)這個(gè)容器的某個(gè)元素。對(duì)于最簡(jiǎn)單的數(shù)組,當(dāng)然可以用數(shù)組的索引值,因?yàn)閿?shù)組是連續(xù)存放在內(nèi)存中的;但對(duì)于鏈表,就必須用指針。除此之外,還有還有很多種數(shù)據(jù)結(jié)構(gòu)需要提供一個(gè)方便的工具來(lái)訪問(wèn)其中的元素,方法有ID,關(guān)鍵字等等。為了統(tǒng)一所有的容器的這種工具的使用,一般提供一整套容器的開(kāi)發(fā)者就會(huì)用一種方式來(lái)表示各種容器的訪問(wèn)工具。例如C++ STL就是使用iterator。MFC自己的容器使用position。C#和java也有自己的方法,但方法是不變的。
iterator的用法可以被統(tǒng)一,但不同的底層容器實(shí)現(xiàn)其iterator的原理是不一樣的。例如iterator++你可以理解為移動(dòng)到容器的下一個(gè)元素,如果底層如果是數(shù)組,把索引值加一就行;如果底層是鏈表,就得執(zhí)行類(lèi)似于m_pCurrent = m_pCurrent->pNext;的操作。因此每種容器都有自己的iterator實(shí)現(xiàn)方法。
Iterator的類(lèi)型
1、Input Interator :只允許作為輸入,也就是只讀(Read Only)
2、Output Interator :只允許作為輸出,也就是只寫(xiě)(Write Only)
3、Forward Interator :允許讀寫(xiě),但只能做前向移動(dòng)
4、Bidirectional Interator :允許讀寫(xiě),可以做雙向移動(dòng)
5、Random Access Interator :允許讀寫(xiě),可以任意移動(dòng)
實(shí)現(xiàn)Distance() 由上可知,從容器特性來(lái)劃分是具有兩種iterator的,一種是線性容器的iterator(數(shù)組,vector等);一種是非線性容器的iterator(鏈表等),因此求兩個(gè)容器的距離自然也是有兩種方法的。
非線性容器:
線性容器:
int distance(RandomAccessIterator p1, RandomAccessIterator p2)


{
return p2-p1;
}

std::distance()實(shí)現(xiàn)了以上兩種Iterator的算法,并根據(jù)傳入的Iterator類(lèi)型進(jìn)行適配。
具體可以參考侯捷翻譯的《STL源碼剖析》一書(shū),當(dāng)中有詳細(xì)的講解。