網(wǎng)站建站知識(shí)惠州seo外包平臺(tái)
迭代器介紹
迭代器(iterator):容器類型內(nèi)置的“指針”
- 使用迭代器可以訪問某個(gè)元素,迭代器也能從一個(gè)元素移動(dòng)到另一個(gè)元素。
- 有迭代器的類型都擁有 begin 和 end 成員- begin:返回指向第一個(gè)元素(或字符)的迭代器- end:尾后迭代器,即尾元素的下一個(gè)位置(一個(gè)本不存在的元素)
使用迭代器
auto b = v.begin(),e = v.end(); // b和e的類型相同
如果容器為空,則begin和end返回的是同一個(gè)迭代器,都是尾后迭代器
舉個(gè)例子,下面利用迭代器實(shí)現(xiàn)
string s = "some string";
if(s.begin() != s.end()) { //確保s非空auto it = s.begin(); //it表示s的第一個(gè)字符*it = toupper(*it); //將當(dāng)前字符改成大寫形式
} //Some string
使用迭代器遍歷容器
for(auto it = s.begin(); it != s.end() && !isspace(*it); ++it) {*it = toupper(*it);
} // SOME string
- 迭代器類型
vector<int>::iterator it; //it能讀寫元素
vector<int>::const_iterator it2;//it2只能讀元素,不可以寫元素
如果vector或者string對(duì)象是一個(gè)常量,只能使用const_iterator;如果不是常量,則既能使用iterator也能使用const_iterator
- 正序迭代
begin();end() //iterator
cbegin();cend() //const_iterator
- 逆序迭代
rbegin();rend() //reverse_iterator
int main() {vector<int> vec{0,1,2,3,4,5,6,7,8,9};vector<int>::reverse_iterator it;for (it = vec.rbegin(); // 迭代器指向最后一個(gè)元素it != vec.rend(); // rend() 指向第一個(gè)元素的前一個(gè)++it) // ++操作訪問前一個(gè)元素cout << *it<< " "; // prints 9,8,7,...0return 0;
}
迭代器解引用
vector<string> vec;
auto it = vec.begin();
(*it).empty() //檢查vector中的元素是否為空,只需檢查it所指字符串是否為空
- 箭頭運(yùn)算符(->)
it->mem & (*it).mem 表達(dá)的意思相同
WARNING
任何一種可能改變vector對(duì)象容量的操作,比如push_back,都會(huì)使該vector對(duì)象的迭代器失效。
但凡是使用了迭代器的循環(huán)體,都不要向迭代器所屬的容器添加元素。
迭代器運(yùn)算
或者是兩個(gè)迭代器相減,就可以得到中間隔了多少個(gè)元素。
使用迭代器運(yùn)算的一個(gè)經(jīng)典算法是二分搜索:
vector<int> text = {1,2,3,4,5};auto sought = 2;auto beg = text.begin(), end = text.end();auto mid = beg + (end - beg) / 2; //初始狀態(tài)的中間點(diǎn)while(mid != end && *mid != sought) {if(sought < *mid) end = mid;else beg = mid + 1;mid = beg + (end - beg) / 2; //新的中間點(diǎn)}
循環(huán)過程終止時(shí),mid或者等于end或者指向要找的元素。如果說mid等于end,說說明text中沒有我們要找的元素。