vector
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)
{
//....
}
- 点赞
- 收藏
- 关注作者
评论(0)