标准模板库STL——迭代器

目录

四类迭代器概述

代码段

普通正向迭代器

普通反向迭代器

常量正向迭代器

常量反向迭代器


四类迭代器概述

四类迭代器

普通正向迭代器 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 
--------------------------------------------------        
*/
相关推荐
念恒123062 小时前
继承(下) (Inheritance)
c++
H Journey3 小时前
C++之 CMake、CMakeLists.txt、Makefile
开发语言·c++·makefile·cmake
研究点啥好呢7 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
_dindong7 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
沫璃染墨7 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
6Hzlia8 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
计算机安禾8 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
unicrom_深圳市由你创科技8 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
无限进步_8 小时前
【C++】电话号码的字母组合:从有限处理到通用解法
开发语言·c++·ide·windows·git·github·visual studio
C++ 老炮儿的技术栈9 小时前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt