STL--迭代器设计原则和萃取机制(Traits)
2024-09-01 20:39:56
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),是迭代器的责任。
设计适当的迭代器,是容器的责任,只有容器才知道什么样的迭代器可以遍历自己,执行相应行为。
算法只需要设计以迭代器为对外接口就行,独立在容器和迭代器之外自行发展。
最新文章
- [LeetCode] Best Time to Buy and Sell Stock III 买股票的最佳时间之三
- ( [原创] 4s摄像头出现的问题及解决办法集锦。
- JMeter学习-013-JMeter 逻辑控制器之-如果(If)控制器
- ArrayList源代码深入剖析
- RedMine项目管理系统安装问题(Linux版一键安装包)
- js冲突怎么解决
- AJAX中的请求方式以及同步异步的区别
- 使用zxing生成二维码 - servlet形式
- uci随笔
- ICE BOX 配置,使用----第一篇
- 【UNIX环境高级编程】文件 IO 操作 一 ( open | close | creat | lseek | write | read )
- 彻底关闭win10后台同步数据(转自技术社区)
- FreeRTOS 任务与调度器(1)
- [svc]tomcat配置文件详解-最简单的基于mvn的war包
- [No000012C]WPF(4/7)类型转换器和标记扩展[译]
- spring注解开发
- ssh stricthostkeychecking=0
- nginx php mysql日志配置
- Kali视频学习21-25
- Orchard运用 - 特定主题添加独立代码文件
热门文章
- mysql5.7 忘记root密码修改方式
- 记录:一次使用私有LoadBalance provider,工具metallb的故障排除
- mysql odbc 配置详解
- Python可视化界面编程入门
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:强制元素隐藏
- stringstream常见用法介绍
- 二、java基础-运算符_控制语句_break_continue_return
- Linux centos7 shell特殊符号、cut命令、sort_wc_uniq命令、tee_tr_split命令、shell特殊符号
- ch4 圆角框
- ch4 背景图像基础