1. 程式人生 > >實戰c++中的string系列--string的遍歷(使用下標還是iterator)

實戰c++中的string系列--string的遍歷(使用下標還是iterator)

迭代器提供了訪問容器中物件的方法。例如,可以使用一對迭代器指定list或vector中的一定範圍的物件。迭代器就如同一個指標。事實上,C++的指標也是一種迭代器。但是,迭代器也可以是那些定義了operator*()以及其他類似於指標的操作符地方法的類物件.

我們都知道可以用下標運算來訪問string物件和vector物件。而另外還有一種更通用的方法也可以實現這樣的方法。名曰:迭代器(iterator)。

類似於指標,迭代器也提供了對物件的間接訪問。就迭代器而言,其物件是容器中的元素或者string中的字元。使用迭代器可以訪問某個元素,迭代器也能從一個元素移動到另外一個元素。迭代器有有效和無效之分,有效的迭代器指向某個元素或者容器中尾元素的下一個位置。其他情況均為無效。

和指標不一樣的是,迭代器不是使用取址符,而是使用begin和end成員。
結合解引用和成員訪問操作

解引用迭代器可以獲得迭代器所指的物件,如果該物件的型別恰好是類,那麼就可以訪問這個類的成員。例如:

(*it).empty();

這裡要注意*it一定要加圓括號,否則會出錯。如果不加,那麼這句話的意思就變成了訪問it的empty成員,但是it是個迭代器,沒有empty成員。C++11中提供了箭頭運算子->,箭頭運算子把解引用和成員訪問兩個操作結合在了一起。故iter->mem 等價於(*iter).mem。

強烈注意:一旦使用了迭代器的迴圈體,那就不要向迭代器所屬的容器新增元素。

迭代器的算術運算:

iter + n 迭代器加上一個整數後仍是一個迭代器,在這裡迭代器和指標很像,可以理解成地址上的加減。

iter1 - iter2 兩個迭代器相減的結果是它們之間的距離。即所指向位置的距離。

<,<=,>,>= 迭代器關係運算符,如果某迭代器指向的容器位置在另一個迭代器所指位置之前,則說前者小於後者。

==============================================================
為何string vector可以使用下標訪問,還設計了迭代器模式呢?

個人覺得:
1、STL設定的初衷是,演算法 容器分離


2、迭代器更通用些,有的容器物件不支援下標
3、一些方法,比如erase只能傳遞iterator

就vector來說差別不大,迭代器其實就是原生指標,但是就C++整體容器來說還是迭代器好,像list這些容器等等,迭代器給你提供一箇中間層,抽象掉各容器間的差異,讓你能以相同的方式訪問容器