STL源码--iterator

STL源码学习系列四: 迭代器(Iterator) 迭代器(Iterator) 前言 在STL的思想中,容器和算法是彼此独立设计的,再通过某种方式使它们连接;而迭代器是使算法独立于使用的容器类型,即迭代器是连接算法和容器的方法。由于迭代器是一种行为类似指针的对象,也就说迭代器是一种广义指针,即迭代器对解除引用操作(operator*)和访问成员操作(operator->)进行重载。然而要对这两个操作符进行重载,对容器内部对象的数据... 阅读详情

  iterator,是stl中至关重要的一个组件,它是stl的基石,对于所有与容器有关的操作,几乎都用到iterator,本文先不谈iterator的各种使用技巧,而是谈谈iterator中的技术:

技术一:标记

//首先是迭代器的类型,我们需要一种方法来标记迭代器的类型,标记的方法多种多样,最简单的是使用掩码(宏定义)
//这里我们为什么不使用一个int或者unsigned来存储一个掩码,而是使用这些对象来表示呢?恰恰是因为节省了内存,因为这种对象
//的size是1个字节,所以我们需要对象时,仅仅是1个字节,而我们并不一定使用这个对象。为什么呢?首先我们明确这些类
//干什么用的,为了说明迭代器的类型。迭代器的类型信息经常会被使用吗?不经常,甚至可以说只是偶尔使用,那么我们如果使用
//掩码来表示类型,那么每个迭代器我们都需要至少2byte的数据来存储掩码,而我们需要为每个迭代器一个不常使用的特性浪费
//内存,这是不值得的。那么,使用下面的方法,效果如何呢?哈哈,对于iterator模板推断,其中使用typedef,size只有1byte,什么
//时候我们需要使用这个信息的时候,可是使用:动态识别。这个技术,在stl中没有涉及(mfc中有此技术);stl中使用了更巧妙的
//的方法,使用函数重载机制,利用此类型信息,具体的可参见使用与迭代器型别有关的算法
struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterator_tag : public forward_iterator_tag {};
struct random_access_iterator_tag : public bidirectional_iterator_tag {};

下面是iterator的基本定义:

template <class _Category, class _Tp, class _Distance = ptrdiff_t,
          class _Pointer = _Tp*, class _Reference = _Tp&>
struct iterator {
  typedef _Category  iterator_category;
  typedef _Tp        value_type;
  typedef _Distance  difference_type;
  typedef _Pointer   pointer;
  typedef _Reference reference;
};

技术二:特性的提取:

//我们对于迭代器的使用,需要迭代器的特性,这个技术非常重要。
//试想,我们得知到一个迭代器类型,我们如何知道这个迭代器所指向的数据类型?这个问题非常常见,必须解决。这里就需要
//特性提取技术,这种技术基于一种协议:所有的迭代器中都有一种value_type,代表所指的数据类型,此问题提供了这一类解决
//问题的方法,定义一种协议,大家都遵循,我们就可以解决很多看似很难的问题。mfc中的大部分技术都是采用这一解决方案
template <class _Iterator>
struct iterator_traits {
  typedef typename _Iterator::iterator_category iterator_category;
  typedef typename _Iterator::value_type        value_type;
  typedef typename _Iterator::difference_type   difference_type;
  typedef typename _Iterator::pointer           pointer;
  typedef typename _Iterator::reference         reference;
};
//指针作为一种特殊的迭代器,我们需要特化,特化如下,值得注意,注意细节的处理:const 指针和一般指针两个特化版本
template <class _Tp>
struct iterator_traits<_Tp*> {
  typedef random_access_iterator_tag iterator_category;
  typedef _Tp                         value_type;
  typedef ptrdiff_t                   difference_type;
  typedef _Tp*                        pointer;
  typedef _Tp&                        reference;
};

template <class _Tp>
struct iterator_traits<const _Tp*> {
  typedef random_access_iterator_tag iterator_category;
  typedef _Tp                         value_type;
  typedef ptrdiff_t                   difference_type;
  typedef const _Tp*                  pointer;
  typedef const _Tp&                  reference;
};

//下面的技术用来提取迭代器的特性,为甚么这么做呢,直接使用_Iter::value_type不行吗?试想,如果迭代器是指针怎么办?
//很明显,我们需要迭代器对于指针的特化版本,
//首先想一下基于迭代器的算法的格式:template<class InputIter> function(InputIter __x)
//当我们__x是一个指针时,我们的InputIter被推断为指针,如何从指针中得出类型信息呢?指针并不是迭代器而是迭代器的一种特殊形式,
//两者的基本实现是不同的,但是都可以看做是迭代器,什么意思呢?就是说迭代器与指针是不同的两种东西,但是其性质是相似的
//我们需要一个包装,能涵盖这两个东西,而不是将指针实现为迭代器的特殊版本---这是不可能的。而这个包装就是大名鼎鼎的
//iterator_traits!

关于特性提取,类似的技术还有type_traits:

//这里采用与iterator一样的技术,标志用类来表示
struct __true_type {
};

struct __false_type {
};

template <class _Tp>
struct __type_traits { 
   typedef __true_type     this_dummy_member_must_be_first;

   typedef __false_type    has_trivial_default_constructor;
   typedef __false_type    has_trivial_copy_constructor;
   typedef __false_type    has_trivial_assignment_operator;
   typedef __false_type    has_trivial_destructor;
   typedef __false_type    is_POD_type;
};

说明一点:对于任意的类型,借助于type_traits,我们都有type_traits(即使是未定义)。所以最基本的type_traits是保证最低需求的:假设构造,复制等等都需要显示的操作。而对于确实不需要显示的复制,构造的类型,我们可以使用模板特化,例如:

template<> struct __type_traits<char*> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};


C++ STL源码剖析之实现一个简单的iterator_category C++ STL源码剖析之实现一个简单的iterator_category导语利用萃取机实现一个简单的iterator_category识别STL源码剖析Iterator 导语 本节使用上节Traits特性,研究iterator源码,来实现一个简单的iterator_category,同时对iterator的源码结构进行分析。 知其然,知其所以然,源码面前了无秘密! 利用萃取机实现一个简单的iterator_category识别 迭代器是指向序列元素的指针的一种抽象。通过使用迭代器,我们可以访问序列中的某个元 阅读详情

相关推荐

Xiaojie雷达之路---毫米波雷达基础知识---角度估计

本篇文章主要介绍毫米波雷达的基础知识中的角度估计,对于本篇文章主要回答5个问题 1.在雷达的前方,如何估计前方一个物体的角度 2.角度测量的准确性 3.如何测量多个物体的角度 4.雷达可测的角度的视场最大值为多少 5.角度分辨率取决于什么因素 文章目录估计雷达前面一个物体的角度角度测量的准确性雷达的最大角视场测量雷达前方多个距离和速度相同的物体角度分辨率角度估计的流程 估计雷达前面一个物体的角度 估计一个物体的角度,最少需要两根接收天线 发射天线发送一个chirp,经过物体发射后信号,信号分别被第一根天

XiaoJie的博客 1万+

stl源码剖析笔记之iterator

此系列是本人阅读《STL源码剖析》的一点心得体会,并结合部分STL源码加深理解。此篇博客为第三章iterator的读书笔记。 综述     有个地方容易混淆,首先,有五种iiterator input iterator output iterator forward iterator, bidirectional iterator, random-access iterator

朱明代月的博客 854

Android Camera性能优化概述

做camera性能优化方面的工作有几年了,想写一篇文章简单介绍一下其中涉及到的具体技术,这篇文章会大概介绍一下涉及到的技术。

weixin_42136255的博客 4023

如何得到iterator的当前元素_C++ STL源码剖析之实现一个简单的iterator_category

C++ STL源码剖析之实现一个简单的iterator_category0.导语大家好,我是光城,欢迎关注公众号:guangcity。本节使用上节Traits特性,研究iterator源码,来实现一个简单的iterator_category,同时对iterator的源码结构进行分析。知其然,知其所以然,源码面前了无秘密!1.利用萃取机实现一个简单的iterator_category识别上一节指出了...

weixin_39732609的博客 325

深入理解C语言内存管理:堆与栈的区别

栈是一种遵循后进先出(LIFO)原则的数据结构。在程序中,栈用于存储局部变量、函数的参数以及函数调用时的返回地址等信息。栈的内存管理由操作系统自动进行,每次函数调用时都会在栈上分配一块内存区域,函数执行完毕后,该内存区域会自动释放。在C语言中,堆与栈是两种不同的内存分配方式,各自有着不同的特点和适用场景。栈内存自动管理,访问速度快,但大小有限,适用于存储局部变量和函数调用信息。堆内存由程序员手动管理,适用于存储动态数据结构,大小不受限制,但访问速度较慢,容易导致内存泄漏等问题。

set_one的博客 1581

Error relaunching VirtualBox VM process:5错误解决

前几天在重新使用VirtualBox的时候出现了一个挺恶心的错误,如图 百度了好久没有找到合适的解决方法。功夫不负有心人,在查阅了vb相关论坛时发现了大牛对此问题的诸多解决方案。下面我把此论坛的内容总结一下,希望对大家有帮助。 论坛链接:Diagnosing VirtualBox Hardening Issues 时间不足的小伙伴可以直接看 解决方法 造成这个错误的主要原因是,windows操作系统与oracle vb的不兼容。有两个方面,一是非官方windows系统中包含了一些没有签名的d

JaCenz的博客 3万+

STL源码剖析之Iterator

STL源码剖析之Iterator typename和typedef的含义 container和algorithm分隔和联系 iterator的五个属性 五种iterator 为什么需要iterator_traits

tanxiaxuan的博客 576

ubuntu18.04 显卡驱动问题 造成屏幕分辨变大 NVIDIA-SMI has failed because it couldn't communicate with ....等问题

问题1:装好了显卡驱动,cudnn,tensorflow等没问题,一直可以用。但是突然有一天不行了,终端输入:nvidia-smi 显示:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed...

梦萦飞--CV/DL/ML 2248

STL源码之iterator实现

STL源码剖析

zp126789zp的博客 511

【人工智能】AI 智能体驾驭工程(Harness Engineering)全解析

OpenAI将Harness定义为让Agent能完成有用工作的系统工程,Harness Engineering则是持续设计、实现、迭代这套系统的方法论;Anthropic将其概括为「让模型真正成为可靠Agent的基础设施」;Martin Fowler/Thoughtworks则将其定义为「控制Agent各层循环的规格、质量检查与工作流指导体系」。强大的AI模型是一匹爆发力极强的烈马;Prompt Engineering是「对马喊话的技巧」,Context Engineering是「给马看的地图」;

奶爸的编程之路,也就一周冷个三天 5244

CMOS图像传感器——工作原理

CMOS图像传感器的曝光与读出

沧海一升的博客 9459

SGI STL 源码解读之 Iterator

引言 引用侯捷在《STL源码剖析》中的话——STL的中心思想中于:将数据容器(contrainers)和算法(algorithms)分开,彼此独立设计,最后再以一贴胶着剂将它们撮合在一起。而Iterator正是扮演了这个撮合的关键角色。从两本权威资料《C++标准程序库》和《STL源码剖析》的解读,以及SGI中Iterator的源码实现来看,我觉得这个分离是在相当多的前提下面进行的。在这方面,标准

行者无疆的专栏 1533

RK3588S之CPU--benchmark(一)

本章会基于RK3588S来介绍有关CPU常用的benchmark工具及测试过程

文艺小少年的博客 1499

STL源码剖析:Iterator

迭代器不一定是class,它有可能是native pointer,原生指针无法定义其关联类型,所以需要一个萃取机来分辨所得到的iterator是class还是native pointer,并利用partial specialization(偏特化)来得到其关联的类型。对于外部接口,只接受迭代器和相关参数。对于没有指定类型对应的重载函数时,会调用参数类型为其父类的重载函数。input_iterator_tag: 该种迭代器所指向类型只读。output_iterator_tag: 所指向类型只写。

m0_61722509的博客 735

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++ STL源码分析——iterator分类

【侯捷-SL体系结构内核分析-iterator】 itertor需要向algorithm提供自身的类型 iterator_category,iterator分为以下五种类型: random_access_iterator_tag,可跨任意距离取值 bidirectional_iterator_tag,可前进或后退 forward_iterator_tag input_iterator_tag o...

ZLP_优快云的博客 581

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

1.STL源码解析-迭代器Iterator

设计迭代器的时候,需要设计适当的相应型别以及对应的符号重载。而设计适当的迭代器,则是容器的责任。只有容器才知道该设计出怎样的迭代器来遍历自己,并执行迭代器该有的各种行为(前进、后退、取值、取用成员等)。而算法,完全是独立于容器和迭代器之外的,可以自由设计,在设计时以迭代器为对外接口就行了。traits技法广泛用于STL中,它利用“内嵌型别”的编程技巧,与编译器的模板templete参数推导功能,来为C++提供型别识别的能力。

weixin_44477424的博客 1266

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STL stl_iterator.h源码解读

/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in al

weixin_42252757的博客 293

C++ STL源码剖析 8-iterator

在 C++ 标准模板库(STL)中,迭代器是一种抽象概念,用于提供对容器内元素的访问。迭代器可以视为指向容器中某个位置的指针,它封装了访问容器元素的方法。迭代器定义了对容器元素进行遍历、访问、插入和删除等操作的方式。T* data;return tmp;it!++it) {// 使用 *it 访问元素在这个示例中,我们定义了一个简单的容器,它包含一个简单的迭代器类。迭代器类提供了operator*operator->

wesigj的博客 1993

STL源码阅读-iterator

侯捷的这一章写的是iterators与traits编程技法,之前就是对于traits这个技法不是

飞鸟 690

《STL源码剖析》-- stl_iterator.h

// Filename: stl_iterator.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://blog.youkuaiyun.com/mdl13412 /* *

一个人的战争 4362

STL源码-iterator traits编程技法

typedef typename iterator_traits::value_type  value _type;       我们可能对typedef很了解,即定义一个别名,其形式是:typedef+原类型名+新类型名;因此,我们可以知道typename iterator_traits::value_type是类型名;但是感到困惑的是这里为什么要使用typename关键字?  

xietingcandice的专栏 887

STL 源码分析 # stl_iterator & stl_iterator_base #

STL 源码分析 # stl_iterator_base && stl_iterator # 这里能很清楚的看到各个基础类型的继承关系 template struct input_iterator { typedef input_iterator_tag iterator_category; typedef _Tp

Jason Leaster | Rebuilding the tower of babel 1086

C++ SGI STL iterator和traits源码分析

C++ STL iterator和traits源码分析iterator:traits: iterator: iterator_category 五种迭代器类型标记 这里共有5种迭代器标记(代表五种类型的迭代器,比如vector就是forward类型的,list是bidirectorational类型的) struct input_iterator_tag {}; struct output_iterator_tag {}; struct forward_iterator_tag : p

weixin_43522787的博客 310

C++ STL源码系列【1】Iterator 迭代器

个人阅读C++ STL源码笔记

weixin_44369534的博客 33

对STL 中算法rotate Random access iterator 源码理解

主要通过下面的表中例子来理解:先给出源码(《STL源码解析》),结合代码看例子 // 最大公因数,利用辗转相除法 // __gcd() 应用于 __rotate() 的 random access iterator 版 template EuclideanRingElement __gcd(EuclideanRingElement m, EuclideanRingElement n)

fiempty的专栏 708
上一篇: STL源码--alloc
下一篇: STL源码-traits的使用
wangyanphp
博客等级 码龄14年 90粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值