在《什么是迭代器?》里我们就粗略地介绍了迭代器,现在,我们将会进行vector迭代器的深入学习,包括认识和实际操作迭代器。vector里的迭代器很简单!先说一下begin()、end(),这两个被称为正向迭代器;rbegin()、rend()被称为反向迭代器,这里r意思是reverse,反转的意思;还有cbegin()、cend()、crbegin()、crend(),这里c指的是const,意为不可修改的,可读不可改的意思。
begin()指向第一个元素,end()指向最后一个元素+1的位置:
下面通过代码演示操作迭代器:
#include<bits/stdc++.h> /* vector是普通数组的promax版 */ using namespace std; /*vector迭代器学习*/ void test() { vector<int> v{1,2,3,4,5}; vector<int>::iterator beg= v.begin(); auto end = v.end();//auto自动推到数据类型 很省事 /*试着遍历数组*/ while(beg!=end) { cout << *beg++ << " " ;//隐藏小知识 } cout << '\n'; } int main(){ test(); return 0; }
rbegin()指向最后一个元素,rend()指向第一个元素-1的位置,有小细节,得使用reverse_iterator反向迭代器:
#include<bits/stdc++.h> /* vector是普通数组的promax版 */ using namespace std; /*vector迭代器学习*/ void test() { vector<int> v{1,2,3,4,5}; vector<int>::reverse_iterator rbeg= v.rbegin() ; auto rend = v.rend();//auto自动推到数据类型 很省事 /*试着遍历数组 但是是逆序遍历*/ while(rbeg!=rend) { cout << *rbeg++ << " " ; } cout << '\n'; } int main(){ test(); return 0; }
最后随便演示一下cbegin()、cend(),触类旁通,都是一个样,这里代码会报错:
#include<bits/stdc++.h> /* vector是普通数组的promax版 */ using namespace std; /*vector迭代器学习*/ void test() { vector<int> v{1,2,3,4,5}; vector<int>::const_iterator cbeg= v.cbegin() ; /*看看能不能修改*/ *cbeg=0; cout << *cbeg<< '\n'; } int main(){ test(); return 0; }
报错内容为:[Error] assignment of read-only location 'cbeg.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator*<const int*, std::vector<int> >()'
尝试为只读位置进行赋值,cbegin()有限制可读不可改,不守规矩就报错!
最后总结一下,vector是动态数组,增减元素都会导致位置变化,所以在使用迭代器时要及时更新迭代器,否则导致迭代器失效,造成程序崩溃等未定义行为。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程