目录
四类迭代器概述
四类迭代器
普通正向迭代器 iterator
常量正向迭代器 const_iterator
普通反向迭代器 reverse_iterator
常量反向迭代器 const_reverse_iterator
解释说明
普通表示可以读元素,也可以写元素;
常量表示只能读元素,不能写元素
代码段
普通正向迭代器
cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
cout << "以vector的普通正向迭代器为例" << endl;
cout << "--------------------------------------------------" << endl;
vector<int> vec;
for(int i = 0; i < 20; i ++)
vec.push_back(rand()%100 + 1);
// 普通正向迭代器 iterator
cout << "普通正向迭代器遍历输出(读元素):" << endl;
vector<int>::iterator it = vec.begin();
for(; it != vec.end(); it ++)
{
cout << *it << " "; // 读元素
if(*it % 2 == 0) *it = 0; // 写元素
}
cout << endl;
cout << "使用普通正向迭代器写元素后遍历输出:" << endl;
for(it = vec.begin(); it != vec.end(); it ++)
cout << *it << " "; // 读元素
cout << endl;
cout << "--------------------------------------------------" << endl;
return 0;
}
/*
以vector的普通正向迭代器为例
--------------------------------------------------
普通正向迭代器遍历输出(读元素):
42 68 35 1 70 25 79 59 63 65 6 46 82 28 62 92 96 43 28 37
使用普通正向迭代器写元素后遍历输出:
0 0 35 1 0 25 79 59 63 65 0 0 0 0 0 0 0 43 0 37
--------------------------------------------------
*/
普通反向迭代器
cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
cout << "以vector的普通反向迭代器为例" << endl;
cout << "--------------------------------------------------" << endl;
vector<int> vec;
for(int i = 0; i < 20; i ++)
vec.push_back(rand()%100 + 1);
cout << "首先,普通正向迭代器遍历输出(读元素):" << endl;
vector<int>::iterator it = vec.begin();
for(; it != vec.end(); it ++)
cout << *it << " "; // 读元素
cout << endl;
cout << "--------------------------------------------------" << endl;
// 普通反向迭代器 reverse_iterator
// rbegin()返回末尾先素的反向迭代器
// rend()返回首元素前驱位置的反向迭代器
cout << "然后,普通反向迭代器遍历输出(读元素):" << endl;
vector<int>::reverse_iterator rit = vec.rbegin();
for(; rit != vec.rend(); rit ++)
cout << *rit << " "; // 读元素
cout << endl;
cout << "总结:正向迭代器正向输出,反向迭代器反向输出" << endl;
cout << "--------------------------------------------------" << endl;
rit = vec.rbegin();
for(; rit != vec.rend(); rit ++)
if(*rit % 2 == 0) *rit = 0; // 写元素
cout << "使用普通反向迭代器写元素后遍历输出(读元素):" << endl;
for(rit = vec.rbegin(); rit != vec.rend(); rit ++)
cout << *rit << " "; // 读元素
cout << endl;
cout << "--------------------------------------------------" << endl;
return 0;
}
/*
以vector的普通反向迭代器为例
--------------------------------------------------
首先,普通正向迭代器遍历输出(读元素):
42 68 35 1 70 25 79 59 63 65 6 46 82 28 62 92 96 43 28 37
--------------------------------------------------
然后,普通反向迭代器遍历输出(读元素):
37 28 43 96 92 62 28 82 46 6 65 63 59 79 25 70 1 35 68 42
总结:正向迭代器正向输出,反向迭代器反向输出
--------------------------------------------------
使用普通反向迭代器写元素后遍历输出(读元素):
37 0 43 0 0 0 0 0 0 0 65 63 59 79 25 0 1 35 0 0
--------------------------------------------------
*/
常量正向迭代器
cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
cout << "以vector的常量正向迭代器为例" << endl;
cout << "--------------------------------------------------" << endl;
vector<int> vec;
for(int i = 0; i < 20; i ++)
vec.push_back(rand()%100 + 1);
// 常量正向迭代器 const_iterator
cout << "常量正向迭代器遍历输出(读元素):" << endl;
vector<int>::const_iterator it = vec.begin();
// iterator可以转为const_iterator
for(; it != vec.end(); it ++)
{
cout << *it << " "; // 读元素
// if(*it % 2 == 1) *it = 0;
// 注意!此处为错误代码!
// 因为常量正向迭代器只能读元素,不能写元素
}
cout << endl;
cout << "--------------------------------------------------" << endl;
return 0;
}
/*
// 关于iterator可以转为const_iterator的解释
// const_iterator <= iterator
class const_iterator // 基类
{
public:
const T & operator*() { return *_ptr; }
};
class iterator : public const_iterator // 派生类
{
public:
T & operator*() { return *_ptr; }
};
*/
/*
以vector的常量正向迭代器为例
--------------------------------------------------
常量正向迭代器遍历输出(读元素):
42 68 35 1 70 25 79 59 63 65 6 46 82 28 62 92 96 43 28 37
--------------------------------------------------
*/
常量反向迭代器
cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
cout << "以vector的常量反向迭代器为例" << endl;
cout << "--------------------------------------------------" << endl;
vector<int> vec;
for(int i = 0; i < 20; i ++)
vec.push_back(rand()%100 + 1);
// 常量反向迭代器 const_reverse_iterator
// rbegin()返回末尾先素的反向迭代器
// rend()返回首元素前驱位置的反向迭代器
cout << "常量反向迭代器遍历输出(读元素):" << endl;
vector<int>::const_reverse_iterator rit = vec.rbegin();
for(; rit != vec.rend(); rit ++)
{
cout << *rit << " "; // 读元素
// if(*rit % 2 == 0) *rit = 0;
// 注意!此处为错误代码!
// 因为常量反向迭代器只能读元素,不能写元素
}
cout << endl;
cout << "--------------------------------------------------" << endl;
return 0;
}
/*
以vector的常量反向迭代器为例
--------------------------------------------------
常量反向迭代器遍历输出(读元素):
37 28 43 96 92 62 28 82 46 6 65 63 59 79 25 70 1 35 68 42
--------------------------------------------------
*/