IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> (六)iterator简介、迭代器萃取器、偏特化的应用 -> 正文阅读

[数据结构与算法](六)iterator简介、迭代器萃取器、偏特化的应用

Iterator需要遵循的原则

  • 迭代器是容器与算法之间的桥梁,算法的最基本特性是它要求其迭代器提供哪些操作
  • 算法问迭代器问题,如iterator_catgory是什么,以便于采取最佳的操作方式。
  • iterator必需提供的5种assocaited types,后面这两种从来都没有被使用过
    • iterator_category迭代器的分类
      • 输入迭代器:只读,不写;单遍扫描,只能递增
      • 输出迭代器:只写,不读;单遍扫描,只能递增
      • 前向迭代器:可读写;多遍扫描,只能递增
      • 双向迭代器:可读写;多遍扫描,可递增递减
      • 随机访问迭代器:可读写,多遍扫描,支持全部迭代器运算
    • value_type容器中元素的类型
    • difference_type两个迭代器之间的距离应该用什么类型表现,如用unsigned int
    • pointer
    • reference
//G2.9
template<class T, class Ref, class Ptr>
struct __list_iterator
{
	typedef bidirectional_iterator_tag iterator_category;
	typedef T value_type;
	typedef Ptr pointer;
	typedef Ref reference;
	typedef ptrdiff_t difference_type;
	...
}

---------------------迭代器回答------------------------
---------------------算法提问--------------------------
template<typename I>
inline void
algorithm(I first, I last)
{
...
	I::iterator_category;
	I::pointer;
	I::reference;
	I::value_type;
	I::diference_type;
...
};
  • 迭代器是一种泛化的指针,指针是一种退化的迭代器
  • 如果算法的参数传入的并不是迭代器而是指针,要如何处理呢
  • ->加萃取器
    • 这个机器必需能区分它所收到的是class型的指针(迭代器)还是一般的指针,返回不同的答案。
    • ->用偏特化实现这种效果

解决计算机问题的尚方宝剑:加一个中介层
汉语里的尚方宝剑对应英语中的sliver bullet

  • 萃取器的实现如下
    • 如果传入的是指针,则返回第二个版本
    • 传入的是常量指针,则返回第三个版本
  • 为什么版本三返回值不加const
    • value_type是用来声明变量的,而声明一个无法被赋值的变量没什么用,所以迭代器的value_type不能加上const
template<class I>
struct iterator_traits{
	typedef typename I::value_type value_type;
};
//偏特化实现指针类型
template<class T>
struct iterator_traits<T*>{
	typedef T value_type;
};
template<class T>
struct iterator_traits<const T*>
	typedef T value_type;//注意是T不是const T
};
------------------当需要知道I的value_type时-----------------
template<typename I, ...>
void algorithm(...){
	typename iterator_traits<I>::value_type v1;
}
  • 完整的iterator_traits
template<class T>
struct iterator_traits{
	typedef typename I::iterator_category iterstor_category;
	typedef typename I::value_type value_type;
	typedef typename I::difference_type difference_type;
	typedef typename I::pointer pointer;
	typedef typename I::reference 
};
//偏特化,普通指针
template<class T>
struct iterator_traits<T*>{
	typedef random_access_iterator_tag iterator_category;
	typedef T value_type;
	typedef ptrdiff_t difference_type;
	typedef T* pointer;
	typedef T& reference;
};
//偏特化,常量指针
template<class T>
struct iterator_traits<const T*>{
	typedef random_access_iterator_tag iterator_category;
	typedef T value_type;
	typedef ptrdiff_t difference_type;
	typedef const T* pointer;
	typedef const T& reference;
};

萃取的分类

  • type traits
  • iterator traits
  • char traits
  • allocator traits
  • pointer traits
  • array traits
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 12:11:23  更:2021-09-30 12:12:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 14:37:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码