STL之迭代器
头文件 < iterator >
主要内容如下:
- 泛型编程与面向对象编程
- 什么是迭代器
- 迭代器类型
- 使用迭代器输入输出小技巧
泛型编程与面向对象编程
- 面向对象编程关注的是编程的数据方面,注重数据结构的重用与继承;
- 泛型编程关注的是算法,注重在不同类型容器上算法的重用;
两者共同特点是:抽象、创建可重用的代码。
```模板使算法独立于存储的数据类型;
迭代器使算法独立于使用的容器;
什么是迭代器
迭代器是一个广义指针,它可以是一个指针,也可以是一个具有类似指针行为的对象。
迭代器的特征:
- 能够对其进行解引用;
- 能够赋值给另一个迭代器;
- 能够比较是否相等(a == b、a != b);
- 能够自增运算,遍历容器;
重载运算符(前缀++、后缀++)
operator++( ) //前缀++
operator++( int ) //后缀++
iterator operator++( int ) {
//返回一个临时的原值,但是原值已经自增完毕
iterator tmp = *this;
pt = pt->next;
return tmp;
}
迭代器类型
-
输入迭代器(只读、单向、无序)
-a- 将容器的内容视为输入;
-b- 能解引用读取容器内值;
-c- 不能修改容器内值;
-d- 两次遍历容器的顺序可能会发生改变;
-e- 单向迭代器; -
输出迭代器(只写、单向、无序)
-a- 将容器视为输出的对象;
-b- 能解引用修改容器内值;
-c- 不能读取容器内值;
-d- 两次遍历容器的顺序可能会发生改变;
-e- 单向迭代器; -
正向迭代器(读写、单向、有序)
-a- 具有1、2所有功能;
-b- 两次遍历顺序相同;
-c- 单向遍历; -
双向迭代器(读写、双向、有序)
-a- 具有3所有功能;
-b- 可双向遍历; -
随机访问迭代器(读写、双向、有序、可随机访问)
-a- 具有4所有功能;
-b- 可随机访问;
注意:
- 以上五个迭代器功能上依次包含;
- 但并不意味着它们的实现可以继承(不能将C++继承机制用于迭代器);
- eg:双向可能是一个指针,正向可能是一个类;
使用迭代器输入输出
#include <iterator>
...
vector <string> vstring = {"abcd", "qwer", "asdf"};
//输出,用rbegin,rend还可以反向输出
//<a,b>第一个类型为发送给os类型string,第二个为希望输出的类型char
//<int, char>就可以把int型输出为char
copy(vstring.begin(), vstring.end(),
ostream_iterator<string, char>(cout, "\n"));
vector<int> vint(5,0);
//注意,这样只能输入5个数字,输入第六个数将被放到vint.end()处,会出错
copy(istream_iterator<int, char>(cin),
istream_iterator<int, char>(), vint.begin());