title: C++ STL迭代器设计原则和萃取机制(Traits)
date: 2019-12-23 15:21:47
tags:

  • STL
  • C/C++
    categories: STL

迭代器 (iterator)

迭代器是算法和容器之间的中间桥梁,迭代器必须能够有能力满足算法的提问,其实也就是规定了迭代器的属性。

STL中迭代器必须提供的五种相关属性(associated types)

  • iterator_category 分类,确定是哪种迭代器,
  • distance 表示两个迭代器之间的距离,如last - begin, middle - begin等
  • value_type 迭代器所指对象的类型
  • reference
  • pointer

Iterator Traits

根据上文,我们知道STL里面 algorithm 每次使用是都会询问桥梁,即对应 iterator 的五个属性。思考一下,传统意义的指针是iterator吗?传统意义的指针能被algorithm调用吗?

指针是iterator,但是传统指针没办法进行typedef, 就没法确定这几个associated type, 而迭代器是泛化的指针。
这样的话,算法是怎么调用传统指针呢?这里就是用了中间层的概念,这也是解决计算机复杂问题的“银色子弹”

一句话概括:迭代器萃取机制(iterator_traits)就是用tratis这个中间层,来区别 class iterators 和 non-class iterators
下面就iterator的value_type属性举例,其GCC 2.9中的代码部分如下:

 //如果是I,就进入这个
template <class I>
struct iterator_traits {
typedef typename I::value_type value_type;
}; //模板特化
//如果I是pointer to T, 就进入这个
template <class T>
struct iterator_traits<T*> {
typedef T value_type;
}; //模板特化
//如果I是pointer to const T, 就进入这个
template <class T>
struct iterator_traits<const T*> {
typedef T value_type;//注意是T而不是const T
}; template<typename I, ...>
void algorithm(...) {
typename iterator_traits<I>::value_type y1;
}

各式各样的traits

除了iterator traits之外还有 type traits, char traits, allocator traits, pointer traits, array traits

总结

设计适当的相应型别(associate types),是迭代器的责任。
设计适当的迭代器,是容器的责任,只有容器才知道什么样的迭代器可以遍历自己,执行相应行为。
算法只需要设计以迭代器为对外接口就行,独立在容器和迭代器之外自行发展。

最新文章

  1. [LeetCode] Best Time to Buy and Sell Stock III 买股票的最佳时间之三
  2. ( [原创] 4s摄像头出现的问题及解决办法集锦。
  3. JMeter学习-013-JMeter 逻辑控制器之-如果(If)控制器
  4. ArrayList源代码深入剖析
  5. RedMine项目管理系统安装问题(Linux版一键安装包)
  6. js冲突怎么解决
  7. AJAX中的请求方式以及同步异步的区别
  8. 使用zxing生成二维码 - servlet形式
  9. uci随笔
  10. ICE BOX 配置,使用----第一篇
  11. 【UNIX环境高级编程】文件 IO 操作 一 ( open | close | creat | lseek | write | read )
  12. 彻底关闭win10后台同步数据(转自技术社区)
  13. FreeRTOS 任务与调度器(1)
  14. [svc]tomcat配置文件详解-最简单的基于mvn的war包
  15. [No000012C]WPF(4/7)类型转换器和标记扩展[译]
  16. spring注解开发
  17. ssh stricthostkeychecking=0
  18. nginx php mysql日志配置
  19. Kali视频学习21-25
  20. Orchard运用 - 特定主题添加独立代码文件

热门文章

  1. mysql5.7 忘记root密码修改方式
  2. 记录:一次使用私有LoadBalance provider,工具metallb的故障排除
  3. mysql odbc 配置详解
  4. Python可视化界面编程入门
  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:强制元素隐藏
  6. stringstream常见用法介绍
  7. 二、java基础-运算符_控制语句_break_continue_return
  8. Linux centos7 shell特殊符号、cut命令、sort_wc_uniq命令、tee_tr_split命令、shell特殊符号
  9. ch4 圆角框
  10. ch4 背景图像基础