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