13.算法的性质

15 篇文章 0 订阅

迭代器的分类

​ 标准库中的算法都是函数模版
在这里插入图片描述

  • 算法的两个版本,第三个参数要传递一个准则,仿函数

迭代器的分类

5种迭代器的分类:有继承的关系

在这里插入图片描述

  1. 输入迭代器
  2. 输出迭代器
  3. 双向迭代器
  4. 随机访问迭代器
  5. 输出迭代器

打印容器迭代器的类型

在这里插入图片描述

  • 产生的是临时对象
  • 使用了模版函数 + 迭代器萃取 traits
  • 最后两个特殊的迭代器

迭代器的typeid

在这里插入图片描述

  • typeid取决于编译器的实现

在这里插入图片描述

在这里插入图片描述

typeid

#include <typeinfo> 
cout << typeid(vector<int>::iterator).name() << endl; 

cout 和 cin 的 iterator

在这里插入图片描述

gnuc4.9的继承关系是为了继承typedef,没有额外的开销。

迭代器分类对算法的影响

​ 算法需要知道迭代器是何种类型的。

eg1.distance 算法,求两个指针之间的距离

在这里插入图片描述

  1. input迭代器 vs 随机访问迭代器
  2. 对外界返回的类型是什么? 通过类型萃取得出 difference type。
    1. 迭代器有五个特性,其中有一个就是difference type
  3. 通过类型萃取获取迭代器的类型,并且通过这个类型创建一个临时对象传给__distance 调用两个版本
  4. 如果距离很大的话,效率差别有多大? O(n) vs O(1)
  5. 使用有继承关系的对象来表现,is-a 关系。一定会落在某个版本中 2个版本,4种分类

eg2. advance

在这里插入图片描述

​ 基础算法,效率很重要

  1. 迭代器是什么类型
    1. 单向迭代器,只能向前
    2. 双向迭代器,向前/向后
    3. 随机迭代器,直接+偏移量
  2. 根据迭代器类型从上面3中函数中选择
  3. 将迭代器类型萃取封装成了一个小函数
  4. 使用有继承关系的对象来表现,is-a 关系
template <typename Iterator>
inline typename iterator_traits<Iterator>::iterator_category
iterator_category(const Iteraotr &)
{
  typedef typename iterator_traits<Iterator>::iterator_category category; 
  return category(); // 返回临时对象
}
 

eg3. copy 函数

  • 泛化 generalization
  • 特化 specialization
  • 强化 refinement

在这里插入图片描述

通过类型萃取判断迭代器是否属于某种特定类型,提供特定的实现(效率高)

  1. const char* , memmove 底层函数,动作极快
  2. const wchar_t* memmove
  3. 泛化的函数继续检查类型
    1. 泛化 继续检查
      1. random access 迭代器?last - first > n
      2. for - loop 相对较慢 first !=last
    2. <T* , T*> 对指针的操作,拷贝赋值
      1. 是否重要,不重要的话不调用拷贝赋值函数
    3. <const T*, const T *>
      1. 是否重要,不重要的话不调用拷贝赋值函数
  4. type traits 类型萃取
    1. 复数类不需要提供拷贝构造,拷贝赋值,析构函数等… 对应着不重要
    2. string类需要。。。 对应着重要

eg4 destroy 类型萃取

在这里插入图片描述

*eg5 unique_copy

​ 排序元素去重拷贝

在这里插入图片描述

  • 针对output-iterator, 实现的版本中避免了read操作

算法的源码中对于迭代器的类型没有限制,只有暗示

在这里插入图片描述

先前示例中出现的算法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值