1. 程式人生 > >C++沉思錄__演算法__迭代器__資料結構

C++沉思錄__演算法__迭代器__資料結構

書中弟18章總結中有這麼一段話:

所謂的泛型演算法,就是這樣的演算法,對於所操作的資料結構的細節資訊,只加入最低限度的理解。當然,這是理想情況,實際上是做不到的,作為這樣一種折中。STL根據資料結構能夠支援的有效操作,將這些資料結構進行分類。然後,對於每一個演算法,指出這個演算法所需要的資料結構的類別。

被分類的不是演算法,也不是資料結構,而是用來訪問資料結構的型別 也就是迭代器,也就是 輸入 ,輸出、前向迭代器 雙向迭代器、以及隨機存起迭代器。概念繼承將這些種類關聯起來,之所以稱之為概念的,是因為這些種類本身都是概念,而不是型別或者物件

這一整套結構,使我們很同意判斷出什麼演算法,應該作用於什麼樣的資料結構之上,另外,該結構提供了一種框架,其他人可以根據這種框架來補充程式庫之外的新演算法。

這段話可以是這麼理解的,實際上,演算法是對資料結構進行操作,演算法,往往作用於特點的資料結構之上,這限制了演算法的作用,對於不同的演算法,可能其資料結構是類似的。為了將資料結構和演算法分開,就產生了這樣一個橋樑,也就是迭代器。迭代器支援不同型別的資料結構,演算法需要特定的資料結構,那麼演算法就可以通過迭代器操作資料結構了。就是隻要資料結構支援特定的操作,這些操作又可以由迭代器來完成,那麼我們就可以用某種演算法。這樣實現了演算法和資料結構的分離。說白了,資料結構支援特定操作,這些特定操作交給特定迭代器完成,演算法通過這些迭代器就可以對資料結構進行操作了。

標準庫中各種各樣的容器,內部都內建了迭代器,以各種容器也就是資料結構的集合。也就實現了容器和演算法的分離。使用的時候,我們拿到迭代器,就可以用演算法支援的迭代器進行處理了。

以上是我對泛型演算法的理解,下面對各類迭代器進行說明。111

input_iterator (輸入迭代器):輸入迭代器只能向前一步一步向前讀取元素,而且一個位置只能讀一次。

Output_iterator(輸出迭代器):輸出迭代器只能用來向前一步一步寫入元素,一個位置只能寫入一次。

Forward_iterator(前向迭代器):前向迭代器基本能做輸入輸出迭代器可以做的一切事情,既可以讀取,也可以寫入,而且還可以多次,但是沒變的是也只能一步一步的向前,不可跨越。

Bidirectional iterators(雙向迭代器):雙向迭代器在前向迭代器的基礎上做了修改,增加了後退的操作,所以叫雙向,同時也儲存了前向迭代器的一切特性,但是也只能一步一步的操作,不可跨越,支援他的容器有List set multiset map multimap 。