【C++ 11 -17】之迭代器的簡介
一、迭代器 vector 的簡介
迭代器是一種遍歷容器內元素的 數據類型,這種數據類型有點像指針,我們理解的時候就理解爲迭代器用來指向容器中的某個元素。string,vector,[],很少用[],更常用的訪問方式就是迭代器(更通用)。通過迭代器,我們就可以讀容器中的原始值,讀string中的每個字符,還可以修改某個迭代器所指向的元素值。++ ,-- list map ,儘量學會用迭代器來訪問容器中的元素。
二:容器的迭代器類型
vector<int> iv = { 100,200,300 };
vector<int>::iterator iter;//定義迭代器,也必須是vector<int>
大家在理解的時候,就把整個的 vector<int>::iterator 理解成一個類型,這種類型就專門應用於迭代器。
當我們用這個類型定義一個變量的時候,這個變量就是迭代器,這裏iter這個變量就是迭代器。
三:迭代器begin()/end()操作,反向迭代器rbegin()/rend()操作
- begin()/end()用來返回迭代類型。
- rebegin()/rend()用來返回 迭代類型
begin()返回一個迭代器類型(大家就理解成返回一個迭代器);
iter = iv.begin();//如果容器中有元素,則begin()返回迭代器,指向的是容器中的第一個元素。
//相當於 iter指向了iv[0];
end():返回一個迭代器類型(大家就理解成返回一個迭代器)
iter = iv.end();//end返回的迭代器指向並不是末端元素。而是末端元素的後邊,拿這個後邊怎麼理解?
//我們就理解成end()指向的是一個不存在的元素。
如果迭代器爲空,那麼迭代器begin和end()返回的迭代器就相同。
vector<int> iv2;
vector<int>::iterator iterbegin = iv2.begin();
vector<int>::iterator iterend = iv2.end();
if (iterbegin == iterend)
{
cout << "容器v2爲空" << endl;
}
迭代器遍歷for語句
vector<int> iv = { 100,200,300 };//定義一個容器
for (vector<int>::iterator iter = iv.begin();iter!= iv.end();iter++)
{
cout << *iter << endl;//100,200,300
}
//反向迭代器:大家想從後往前遍歷一個容器,那麼反向迭代器就比較方便。
//反向迭代器(逆向迭代器)用的rbegin()/rend();
//rbegin():返回一個反向迭代器,指向反向迭代器的第一個元素;
//rend():返回一個反向迭代器,指向反向迭代器最後元素的下一個位置。
for (vector<int>::iterator riter = iv.rbegin(); riter != iv.rend(); riter++)
{
cout << *riter << endl;//300,200,100
}
四、迭代器運算符
//a) *iter:返回迭代器iter所指向元素的引用。必須要保證這個迭代器指向的是有效的元素容器
//不能指向end(),因爲end()是末端元素的後邊。就是end()指向的是一個不存在的元素。
vector<int> iv3 = {100,200,300};
vector<int>::iterator iter = iv3.begin();
cout << *iter << endl;//正確
vector<int>::iterator iter = iv3.end();
cout << *iter << endl;//異常 段錯,內存錯誤
//b)++iter:iter++:讓迭代器指向容器中下一個元素;已經指向end()的時候不能再++;
vector<int> iv4 = { 100,200,300 };
vector<int>::iterator iter = iv4.end();
//iter++;
++iter;
cout << *iter << endl;//程序錯誤終止,異常終止
vector<int>::iterator iter = iv4.begin();
//iter++;
++iter;
cout << *iter << endl;//正常 200
//c) --iter和iter--:讓迭代器指向容器中的上一個元素。指向開頭元素,就不能再--
vector<int>::iterator iter = iv4.begin();
//iter--;
//cout << *iter << endl;//錯誤終止
vector<int>::iterator iter = iv4.end();
iter--;
cout << *iter << endl;//300 正確