【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 正确