用法 stl_《STL源码剖析》第三章迭代器(iterators)概念与traits编程技法

本文围绕STL迭代器展开,介绍其概念与traits编程技法。STL核心是将数据容器和算法分离,用迭代器连接。迭代器类似智能指针,需重载操作符。还阐述了迭代器的五种相应类别,以及traits编程技法,包括参数类别推导、内嵌型别声明等,同时介绍了不同类型迭代器特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.迭代器(iterators)概念与traits编程技法

STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后在以一贴胶着剂将它们撮合在一起。

3.1 迭代器设计思维——STL关键所在

STL中心思想:将数据容器和算法分开,彼此独立设计,最后再以已贴粘着剂将他们撮合在一起

3.2 迭代器是一种smart pointer

迭代器是一种行为类似指针的对象,指针的最常见最重要的是内容提领(取出指标所指物体的内容dereference)和成员访问(member access)。所以,迭代器最重要的编程工作是对operator *和operator->进行重载(overloading)工作。

auto_ptr 是一个用来包装原生指针的对象,内存漏洞问题可以借此解决。用法如下,和原生指针一模一样。

437e7a6722cba2d0e80ae89741ec410d.png

3.3 迭代器相应类别(associated types)

最常用的相应类别有五种

value type:迭代器所指对象的型别。

difference type :表示两个迭代器之间的距离,可用于表示容器的最大容量。

pointer type:代表迭代器所指对象的指针类型。简言之,operator->()的返回类型。

reference type:代表迭代器所指对象的引用类型。简言之,operator*()的返回类型。分为两种,不允许改变“所指对象之内容”者称为constant iterators,例如 const int* pic,允许改变“所指对象之内容”者称为 mutable iterators,例如 int* pi。 *pic/*pi的型别constant T&/T&就是reference type。

iterator category type:提出5种迭代器的类型标识。

使用函数模板的参数推导机制

推导的是参数,无法推导函数的返回值类型

3.4 traits编程技法——STL源代码门钥

  1. 参数类别推导技巧虽然可以用于value type,但非全面可用:value type 用于函数的传回值

声明内嵌型别

关键词typename 的用意在于告诉编译器这是个型别

隐晦的陷阱:并不是所有的迭代器都是class type,如果不是class type 就无法为他定义内嵌类别

partial specialization(偏特化)的意义

c7b90bde355c621892279891570f08a8.png

880ead106e6a3d9af16b23486310b7ae.png

cdb1e17d4af1a70532ef93ba96979794.png
  1. Iterator category

Input Iterator:不允许外界改变。只读。

Output Iterator:唯写(write only)

Forward Iterator: 允许写入型算法(例如replace())在此种迭代器所形成的区间上进行读写操作。

Bidirectional Iterator:可双向移动。某些算法需要逆向走访某个迭代器区间(例如逆向拷贝某范围内的元素)

Random Access Iterator: 前四种迭代器都只供应一部分指针算术能力(前三种支持operator++,第四种再加上operator--),第五种则涵盖所有指针的算术能力,包括p+n,p-n,p1-p2,p1<p2.

注意:STL算法的一个命名规则:以算法所能接受的最低阶迭代器类型来为其迭代器型别参数命名

8a83c6c1638631fcef4cc15c337cd796.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值