《泛型编程与STL》读书笔记

本文深入探讨了C++中迭代器的概念及其应用,特别是iterator_traits的作用和重要性。详细解释了如何使用iterator_traits来提取迭代器的相关类型信息,以及在自定义迭代器和算法实现中为何需要此机制。

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

关键词:
迭代器,函数配接器,迭代器之配接器(Iterator Adapters)
iterator_traits
迭代器的associated type是value_type,difference_type,reference_type,pointer_type,size_type,iterator_category
iterator_tag是iterator_category所属(typedef 5个类之一为iterator_category类型)的5个空类(struct),用来具体区别一个算法的多个实现版本的选择

iterator_traits
what iterator_traits:是个模板类,用于编译时类型推测。可以让算法根据iterator具体实现的不同(例如原生指针,或iterator class,指向const对象的原生指针)提取相应的associated type(value_type,difference_type等(按用途分:临时值类型,返回值类型))
template <class I>
struct iterator_traits
{
  typedef typename I:value_type value_type;
  typedef typename I:difference_type value_type;
};

why iterator_traits:声明count的返回值的difference_type;迭代器的value type
通过iterator_traits实现根据不同的迭代器实现(如iterator class,或原生指针,指向const对象的原生指针(如const int *)),来提取迭代器的value type(即*iter类型),difference_type等。

why and when iterator_traits p63:
当定义自己的iterator class算法时,会用到iterator_traits
1)你必须返回某值,或是声明临时变量,而其类型与iterator的value type或difference type或reference type或pointer type一致
2)你的算法类似advance,必须根据iterator的分类而决定不同的实现方法。如果没有iterator_traits机制,有时候你只好被迫在“一般化,却没有效率”与“有效率,但过度狭隘”两者之间做一个难以取舍的决定。

how iterator_traits :多了一层中间层,可以独立编写特化版
how 客户端程序员:每一个迭代器类,必须以内嵌类型定义的方式定义迭代器的value type
template <class Node>struct Node_wrap
{
   typedef Node value_type;
   Node *ptr
};



what Concept:p38

迭代器
what迭代器:用来遍历某个序列。通常用来stl容器内全部或部分元素的对象。
                      迭代器是一种智能指针,其具体实现取决于其所遍历的数据结构,因此,每一种容易类型都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套方式定义于内部。因此各种迭代器的接口相同,类型却不同。

why迭代器:
Iterator对于泛型编程之所以重要,原因是它是算法与数据结构之间的接口。Iterator可说是STL最重要的一个创新发明,它使“将算法与相关数据结构之间的关系切割分离”一事变得可能
我们仅仅要求:iterator能够以某种线性顺序遍历某个数据结构,以访问其中的所有元素

Input IteratorOutput IteratorFoward Iterator
Input Iterator:向前读取,只读,并只读一次
Output Iterator:向前读取,只写,并同一位置只写一次
Foward Iterator:支持的指针运算与Input Iterators及Output Iterators同级(可以写++p,但不能写--p或p+=5),其他方面限制较为宽松。
                         可修改。可在同一区间内使用一个以上iterator p47
任何容器类都支持Foward Iterator
find,find_if,for_each,find_if,equal,partial_sum,random_sample,set_intersection使用的是Input Iterator
Bidirectional Iterator是Foward Iterator的refinement(强化)
Random Access Iterator是Input Iterator的一个refindment


p69
STL中心特性是“作用于以iterators形成的range之上的泛型算法”。所有iterators率属于五个与指针极为类似的“concepts”家族。iterators自身提供有一种分类方法,可以让使用者知道“何种算法可用于何种数据结构”

p57
why difference_type:ptrdiff_t所表示的范围还不够大
两个iterator相减的结果是iterator::difference_type。如果iterator是指针,指针相减,其类型为ptrdiff_t。之所以iterator相减的结果不是ptrdiff_t,是因为ptrdiff_t所表示的范围还不够大

p52
iterator不单是一个concept,而是一群彼此具有refinement关系的concepts家族


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值