STL--迭代器设计原则和萃取机制(Traits)
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),是迭代器的责任。
设计适当的迭代器,是容器的责任,只有容器才知道什么样的迭代器可以遍历自己,执行相应行为。
算法只需要设计以迭代器为对外接口就行,独立在容器和迭代器之外自行发展。
STL--迭代器设计原则和萃取机制(Traits)的更多相关文章
- C++标准库分析总结(三)——<迭代器设计原则>
本节主要总结迭代器的设计原则,以及iterstor traits的设计作用 1.迭代器遵循的原则 迭代器是算法和容器的桥梁,它是类模板的设计,迭代器必须有能力回答算法提出的问题才能去搭配该算法的使用 ...
- 类型萃取(type traits)
1. 类型萃取的作用 类型萃取使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他.例如:在STL ...
- STL的迭代器和类型萃取
今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于 ...
- STL 萃取(Traits)机制剖析
模板特化 在将萃取机制之前,先要说明模板特化 当有两个模板类,一个是通用泛型模板,一个是特殊类型模板,如果创建一个特殊类型的对象,会优先调用特殊的类型模板类,例如: template <type ...
- STL——迭代器与traits编程技法
一.迭代器 1. 迭代器设计思维——STL关键所在 在<Design Patterns>一书中对iterator模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素 ...
- c++11——type_traits 类型萃取
一. c++ traits traits是c++模板编程中使用的一种技术,主要功能: 把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用tr ...
- STL源代码分析--萃取编程(traits)技术的实现
1.为什么要出现? 依照默认认定.一个模板给出了一个单一的定义,能够用于用户能够想到的不论什么模板參数!可是对于写模板的人而言,这样的方式并不灵活.特别是遇到模板參数为指针时,若想实现与类型的參量不一 ...
- traits编程---萃取容器中迭代器的类型等
可以直接利用STL中定义好的traits_iterator来萃取 /*特性萃取器*/ template <class unknown_class> struct unknown_class ...
- C++的类型萃取技术
应该说,迭代器就是一种智能指针,因此,它也就拥有了一般指针的所有特点——能够对其进行*和->操作.但是在遍历容器的时候,不可避免的要对遍历的容器内部有所了解,所以,设计一个迭代器也就自然而然的变 ...
随机推荐
- VS2010如何在同一个解决方案下建立多个项目以及切换运行不同项目
前言: 在编一些小程序时,往往我们不需要一个问题就建立一个解决方案,我们完全可以让多个项目放在同一个解决方案下,切换启动项运行即可.接下来介绍具体的步骤 一.建立空白解决方案以及添加新项目 1.先建立 ...
- PHP中的异常知识
一.绪 首先明确一点:异常和错误不是一回事. 一个异常(Exception)是一个程序执行过程中出现的一个例外或是一个事件,它中断了正常指令的运行,跳转到其他程序模块继续执行. 基本格式: try { ...
- Flutter 使用json_model解析json生成dart文件
一.json_serializable使用步骤 1.集成json_serializable pubspec.yaml 添加以下依赖 dependencies: json_annotation: ^2. ...
- DeepLearning算法文章
算法源码: learn_dl : https://github.com/hanbt/learn_dl rnn-from-scratch : https://github.com/pangolulu/r ...
- [Android]ListView中分割线的设置
1.在布局文件中ListView元素中通过属性设置 android:divider="#fffff" 分割线颜色 android:dividerHeight="1px& ...
- 怎样实现android 返回到上一个Activity并重新执行一次onCreate方法
1.onCreate 方法只在activity一开始创建的时候执行.2.也就是在该activity销毁后才能再次执行,假如当前activity上再打开一个activity,并且原来的activity已 ...
- RabbitMq学习笔记——RabbitMQ C的使用
1.需要用到的参数: 主机名:hostname.端口号:port.交换器:exchange.路由key:routingkey .绑定路由:bindingkey.用户名:user.密码:psw,默认用户 ...
- 分享Burp Suite遇到的各种坑
1.性质问题 价格昂贵 专业版高达399美元/每年,免费版有功能限制:https://portswigger.net/buy/pro,构想中的工具应该是免费开源的. 破解版存在安全隐患 https:/ ...
- IDEA中如何部署tomcat
1.添加tomcat 2.添加tomcat所依赖的war包 test009.war包刚开始可能不存在,这个时候需要将maven项目进行打包,然后点击“+”之后就会出现一个和项目名同名的war包,选中就 ...
- SpringBoot开发环境要求
JDK 截止到目前Spring Boot 的最新版本:2.1.8.RELEASE 要求 JDK 版本在 1.8 以上,所以确保你的电脑已经正确下载安装配置了 JDK(推荐 JDK 1.8 版本). 构 ...