C++ STL之迭代器(C++ primer,P685)

STL之迭代器

头文件 < iterator >

主要内容如下:

  • 泛型编程与面向对象编程
  • 什么是迭代器
  • 迭代器类型
  • 使用迭代器输入输出小技巧

泛型编程与面向对象编程

  • 面向对象编程关注的是编程的数据方面,注重数据结构的重用与继承;
  • 泛型编程关注的是算法,注重在不同类型容器上算法的重用;

两者共同特点是:抽象、创建可重用的代码。

```模板使算法独立于存储的数据类型;
迭代器使算法独立于使用的容器;

什么是迭代器

迭代器是一个广义指针,它可以是一个指针,也可以是一个具有类似指针行为的对象。

迭代器的特征:

  • 能够对其进行解引用;
  • 能够赋值给另一个迭代器;
  • 能够比较是否相等(a == b、a != b);
  • 能够自增运算,遍历容器;

重载运算符(前缀++、后缀++)

operator++( )		//前缀++
operator++( int )	//后缀++

iterator operator++( int ) {
//返回一个临时的原值,但是原值已经自增完毕
	iterator tmp = *this;
	pt = pt->next;
	return tmp;
}

迭代器类型

  1. 输入迭代器(只读、单向、无序)
    -a- 将容器的内容视为输入;
    -b- 能解引用读取容器内值;
    -c- 不能修改容器内值;
    -d- 两次遍历容器的顺序可能会发生改变;
    -e- 单向迭代器;

  2. 输出迭代器(只写、单向、无序)
    -a- 将容器视为输出的对象;
    -b- 能解引用修改容器内值;
    -c- 不能读取容器内值;
    -d- 两次遍历容器的顺序可能会发生改变;
    -e- 单向迭代器;

  3. 正向迭代器(读写、单向、有序)
    -a- 具有1、2所有功能;
    -b- 两次遍历顺序相同;
    -c- 单向遍历;

  4. 双向迭代器(读写、双向、有序)
    -a- 具有3所有功能;
    -b- 可双向遍历;

  5. 随机访问迭代器(读写、双向、有序、可随机访问)
    -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()); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值