1.vector
vector vjihe3; //语法错误,因为vector不能用来装引用,引用只是一个别名而不是对象
vector<int> a{ 1,2,3,4,5 }; for (auto& aaa : a) { aaa = 2; } for (auto& aaa : a) cout << aaa << endl;
注意不要在for循环内改变vector的容量,增加删除元素都是不可以
2.迭代器
迭代器可以理解成用来指向容器中的某个元素的,有点像指针
vector iv = {100, 200, 300}; //定义一个容器
vector::iterator iter; //定义迭代器,也必须是vector开头
iterator是什么,它是每个容器(如vector)里面都定义了的一个成员(类型名),这个名字是固定的,请记住
每一种容器,如vector,都绑定了一个叫做begin的成员函数和一个叫end的成员函数
这两个成员函数用来返回迭代器的类型
iter = iv.begin();
iter = iv.end();//end返回的迭代器指向的并不是最后一个元素,而是末端元素的后面,这个后面怎么理解呢,就是end()指向的是一个不存在的元素
end起到了一个岗哨的作用,当从begin开始走,当begin走到end的位置时候,说明遍历完所有元素了
3.反向迭代器,rbegin,rend
迭代器中的iter++和++iter是同样的功能,让迭代器指向容器中的下一个元素,但是如果已经指向了end,就不能再++了,否则运行报错
–iter和iter–是一样的道理
struct student { int num; }; vector<student> sv; student mystu; mystu.num = 100; sv.push_back(mystu);//把对象mystu复制给了sv容器中 mystu.num = 200; vector<student>iterator iter; iter = sv.begin(); cout<<(*iter).num << endl; //100,注意引用方法,*iter是一个结构变量,所以用“.”成员来引用成员 cout <<iter->num <<endl;//100,iter想成一个指针,所以用->引用成员
每个容器除了iterator这种迭代器类型,还有另一种迭代器类型叫做const_iterator,这里不能改的意思是,迭代器指向的元素不能改变,而不是迭代器不能变,迭代器还是可以不断指向容器中其他元素的,所以只能读元素,不能改元素,有点像常量指针,而iterator可以读也可以写
如果容器对象是一个常量,那么就必须用const_iterator否则报错
cbegin,cend成员函数,返回的是都是常量迭代器const_iterator;
vector<int> iv = { 1,2,3,4,5 }; vector<int>::const_iterator it; for (it = iv.cbegin(); it != iv.cend(); ++it) { *it = 888; //错误,不能给常量赋值,这说明cbegin返回的是常量迭代器 cout << *it << endl; }
4.迭代器失效
如果在for循环里面插入元素到容器的话,那就必须跳出循环体,不能再继续用这些迭代器操作容器
for (auto beg = iv.begin(), end = iv.end(); beg != end; ++beg) { iv.push_back(88); break; //立刻跳出循环,这里的beg,end都不能再使用,以免出问题,后续重新用循环重新拿begin和end使用 } //重新定位迭代器 for (auto beg = iv.begin(), end = iv.end(); beg != end; ++beg) { //.... }