《什么是迭代器?》里我们就粗略地介绍了迭代器,现在,我们将会进行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是动态数组,增减元素都会导致位置变化,所以在使用迭代器时要及时更新迭代器,否则导致迭代器失效,造成程序崩溃等未定义行为。


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)