代码解析
#include <iostream>
#include <vector>
/*
迭代器精彩演绎、失效分析及弥补、实战
(1)迭代器简介
(2)容器的迭代器类型
(3)迭代器begin()/end()操作,反向迭代器rbegin()/rend()操作
(4)迭代器运算符
(5)const iterator迭代器
(5.1)cbegin()和cend()操作
(6)迭代器失效
(6.1)灾难程序演示1
(6.2)灾难程序演示2
(7)范例演示
(7.1)用迭代器遍历一下string类型的数据
(7.2)vector容器常用操作与内存释放
*/
using namespace std;
struct student{
int num;
};
int main()
{
// (1)迭代器简介:迭代器是一种遍历容器内元素的数据类型,感觉有点像指针,迭代器用来指向容器内的某个元素
// vector
// 很少用[]的方式访问元素,更常用的方式是使用迭代器
// 通过迭代器,我们可以读容器内的元素值,读string中的每个字符,还可以修改迭代器所指向的元素
// ++,--运算
// list,map尽量使用迭代器访问容器中的元素
// (2)容器的迭代器类型:
vector<int> iv = {100,200,300};
vector<int>::iterator iter; //定义迭代器,也必须是vector<int>
// vector<int>::iterator理解成一个类型,这种类型就专门应用于迭代器
// 当我们用这个类型定义一个变量的时候,这个变量就是一个迭代器,这里iter这个变量就是个迭代器
// (3)迭代器begin()/end()操作,反向迭代器rbegin()/rend()操作
// begin()/end()返回迭代类型,(理解成返回一个迭代器)
iter = iv.begin();//如果容器中有元素,则begin返回的迭代器,指向的是容器中的第一个元素
// 相当于iter指向了iv[0]
// end()也是一样的,末尾段元素的后边,不存在的元素
iter = iv.end();
// if size == 0 则begin和end指向的内容相同
vector<int> iv2;
vector<int>::iterator iterbegin = iv2.begin();
vector<int>::iterator iterend = iv2.end();
if(iterbegin == iterend){
cout << "iv2 is empty" << endl;
}
vector<int> iv3 = {100,200,300}; //定义一个容器
for(vector<int>::iterator iter = iv3.begin();iter != iv3.end();iter++){
cout << *iter << endl;
}
// 反向迭代器: rbegin指向反向迭代器第一个元素
vector<int> iv4 = {100,200,300}; //定义一个容器
for(vector<int>::reverse_iterator iter4 = iv4.rbegin();iter4 != iv4.rend();iter4++){
cout << *iter4 << endl;
}
// (4)迭代器运算符:*iter指向元素的引用,必须保证是有效的元素
// 不能指向end(),因为end()是末端元素的后边,也就是end()指向的是一个不存在的元素
// iter5 = iv4.end();
// cout << *iter5 << endl;
// ++iter,--iter.前/后一个元素移动,指向头了可以--,指向尾了可以++(有的编译器不能这么操作)
vector<int>::iterator iter6 = iv4.end();
iter6++;
vector<int>::iterator iter7 = iv4.begin();
iter7--;
iter7--;
// 比较 == !=
// 结构体容器
vector<student> sv;
student mystu;
mystu.num = 111;
sv.push_back(mystu);
vector<student>::iterator iter8;
iter8 = sv.begin();
cout << (*iter8).num << endl;
cout << iter8->num << endl;
// (5)const iterator迭代器:值不能改变
// 迭代器指向的元素不能改变
// 只能读不能写
vector<int>::const_iterator iter9;
for(iter9 = iv4.begin();iter9 != iv4.end();iter9++){
// *iter9 = 10; //报错
cout << *iter9 << endl;//正常读
}
// (5.1)cbegin()和cend()操作:C++11引入的新特性:返回的都是常量迭代器
for(auto iter10 = iv4.cbegin();iter10 != iv4.cend();++iter10){
cout << *iter10 << endl;
}
// (6)迭代器失效
vector<int> iv5{1,2,3,4,5};
for(auto vecitem:iv5){
// iv5.push_back(8);
cout << vecitem << endl;
}
// 在操作迭代器容器过程中(迭代器循环体),千万不要改变容器 的容量,不要增加或减少vector容器中的元素
// 迭代器失效:程序直接奔溃
for(auto beg = iv5.begin();beg != iv5.end();++beg){
// iv5.push_back(656);
cout << *beg << endl;
}
// (6.1)灾难程序演示1
vector<int> iv6{1,2,3,4,5};
auto beg2 = iv6.begin();
auto end2 = iv6.end();
while(beg2 != end2)
{
cout << *beg2 << endl;
// iv6.insert(beg2,80); //break就安全了
++beg2;
}
// (6.2)灾难程序演示2
// for(auto iter = iv6.begin();iter != iv6.end();iter++){
// iv6.erase(iter);
// }
while(!iv6.empty()){
auto iter = iv6.begin();
iv6.erase(iter);
}
// (7)范例演示
// (7.1)用迭代器遍历一下string类型的数据
// (7.2)vector容器常用操作与内存释放(存放对象的指针,依次释放容器里面的指针,最后释放对象)
cout << "Hello World!" << endl;
return 0;
}