C++面向对象入门(四十一)迭代器

迭代器:面向对象版本的指针, 提供了访问容器和序列中每一个元素的方法
用途:STL算法利用迭代器对存储在容器中的元素序列进行遍历
 
迭代器和指针的关系:
1 指针是一种迭代器, 但迭代器不仅仅是指针.
2 指针可以指向内存中的一个地址, 然后通过这个地址访问相应的内存单元. 而迭代器更为抽象, 它可以指向容器中的一个位置,
然后直接访问这个位置的元素
 
为什么引入迭代器?
迭代器是算法和容器的"中间人". 如同访问链表需要使用指针, 访问数组需要使用下标, 这时指针和下标便充当了算法和数据结构
的"中间人". 容器是封装起来的模板, 只能通过容器接口来使用容器. 仅仅靠容器接口不能对元素进行灵活访问, 何况STL算法是
通用的函数模板, 并不是针对哪个容器类型的,算法要适用多种容器, 不能单纯的使用指针和数组下标来实现, 因为根据容器存储的
数据结构的指针类型往往不同, 而用些容器没有定义下标运算符, 因此需要引入更抽象的指针--迭代器.
 
迭代器的分类
为什么要分类?
满足不同算法的需要
 
具体分为5种基本类型:
1 输出迭代器(output): 允许写入数据, 只能向前写入, 支持++, 不支持--, 不保证可以从中读取数据(输出意为程序向容器输出)
2 输入迭代器(input): 允许读取数据, 只能向前读取, 支持++, 不支持--, 不保证可以向容器中写入数据(输入意为从容器输入到程序中)
3 前向迭代器(forward): 允许读取和写入数据, 只能向前读取和写入, 支持++, 不支持--
4 双向迭代器(bidirectional): 允许读取和写入数据, 支持向前和向后读取和写入, 既支持++, 亦支持--
5 随机访问迭代器(random access): 允许读取和写入数据, 能够在序列任意两个位置进行跳转
 
STL使用typedef预定义了一些迭代器:
预定义迭代器    ++操作方向    功能
iterator     向前     读/写
const_iterator    向前     读
reverse_iterator   向后     读/写
const_reverse_iterator  向后     读
 
代码示例:
#include <iostream>
#include <list>
using namespace std;

/*
迭代器:面向对象版本的指针, 提供了访问容器和序列中每一个元素的方法

用途:STL算法利用迭代器对存储在容器中的元素序列进行遍历

迭代器和指针的关系:
1 指针是一种迭代器, 但迭代器不仅仅是指针.
2 指针可以指向内存中的一个地址, 然后通过这个地址访问相应的内存单元. 而迭代器更为抽象, 它可以指向容器中的一个位置,
然后直接访问这个位置的元素

为什么引入迭代器?
迭代器是算法和容器的"中间人". 如同访问链表需要使用指针, 访问数组需要使用下标, 这时指针和下标便充当了算法和数据结构
的"中间人". 容器是封装起来的模板, 只能通过容器接口来使用容器. 仅仅靠容器接口不能对元素进行灵活访问, 何况STL算法是
通用的函数模板, 并不是针对哪个容器类型的,算法要适用多种容器, 不能单纯的使用指针和数组下标来实现, 因为根据容器存储的
数据结构的指针类型往往不同, 而用些容器没有定义下标运算符, 因此需要引入更抽象的指针--迭代器.

迭代器的分类
为什么要分类?
满足不同算法的需要

具体分为5种基本类型:
1 输出迭代器(output): 允许写入数据, 只能向前写入, 支持++, 不支持--, 不保证可以从中读取数据(输出意为程序向容器输出)
2 输入迭代器(input): 允许读取数据, 只能向前读取, 支持++, 不支持--, 不保证可以向容器中写入数据(输入意为从容器输入到程序中)
3 前向迭代器(forward): 允许读取和写入数据, 只能向前读取和写入, 支持++, 不支持--
4 双向迭代器(bidirectional): 允许读取和写入数据, 支持向前和向后读取和写入, 既支持++, 亦支持--
5 随机访问迭代器(random access): 允许读取和写入数据, 能够在序列任意两个位置进行跳转

STL使用typedef预定义了一些迭代器:
预定义迭代器                ++操作方向                功能
iterator                    向前                    读/写
const_iterator                向前                    读
reverse_iterator            向后                    读/写
const_reverse_iterator        向后                    读
*/
int main()
{
    //使用list类模板实例化整型list并定义list<int>对象
    list<int> nums;
    nums.insert(nums.begin(), -99);
    nums.insert(nums.begin(), 5);
    nums.insert(nums.end(), 40);
    //定义只读迭代器
    list<int>::const_iterator p1;
    cout << "正向输出双向链表的所有元素:" << endl;
    for ( p1 = nums.begin(); p1 != nums.end(); p1++)
    {
        cout << *p1 << " ";
    }
    cout << endl;

    //定义反向只读迭代器
    list<int>::const_reverse_iterator p2;
    cout << "反向输出双向链表的所有元素:" << endl;
    for ( p2 = nums.rbegin(); p2!=nums.rend(); p2++)
    {
        cout << *p2 << " ";
    }
    cout << endl;

    system("pause");

}

 

posted @ 2020-09-04 15:19  DNoSay  阅读(277)  评论(0编辑  收藏  举报