##實戰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這些容器等等,迭代器給你提供一個中間層,抽象掉各容器間的差異,讓你能以相同的方式訪問容器
- 前言
- string與整型或浮點型互轉
- 指定浮點數有效數字并轉為string
- string的替換、查找(一些與路徑相關的操作)
- string的分割、替換(類似string.split或是explode())
- string的初始化、刪除、轉大小寫(construct erase upper-lower)
- string的遍歷(使用下標還是iterator)
- std::string與MFC中CString的轉換
- string到LPCWSTR的轉換
- std:vector<char> 和std:string相互轉換(vector to stringstream)
- CDuiString和string的轉換(duilib中的cduistring)
- string的連接(+= or append or push_back)
- 函數返回局部變量string(引用局部string,局部string的.c_str()函數)
- 將string用于switch語句(c++做C#的事兒, switch中break還是return厲害)
- 不要使用memset初始化string(一定別這么干)