游戏思考26:使用EASTL配合共享内存做自定义STL(未完待续12/27)

news2025/1/21 3:00:39

文章目录

    • 一、前置学习
      • 1)萃取
        • (1)迭代器所指对象的类型-value_type
          • <1>第一个限制-返回参数需要指明迭代器的value_type
          • <2>第二个限制坑点-不是所有迭代器都是class type,原生指针就不是
          • <3>第三个限制坑点-如果针对"指向常数对象的指针(point-to-const)"获得的值带const不是我们期望的
        • (2)最常用到的迭代器类型有五种:
          • <1>value_type
          • <2>difference_type
          • <3>pointer_type
          • <4>reference_type
          • <5>iterator_category

一、前置学习

1)萃取

(1)迭代器所指对象的类型-value_type

  • 备注
    因为迭代器需要知道所指向对象的类型
<1>第一个限制-返回参数需要指明迭代器的value_type

迭代器所指对象的类型,称为该迭代器的value type,上述的参数类型推导只可适用于推导函数参数,却不能作为函数的返回值

  • 解决办法
    声明内嵌类型
template <class T>
struct MysIter
{
	typedef T value_type;   //内嵌类型声明
	T*  Ptr;
	MyIter(T	* p=0):ptr(p){}
	T& operator*() const {return *ptr};
	//...
};

template <class T>
typename I::value_type; //这一整行是func的返回值类型
func(I ite)
{
	return *ite;
}


//...
MyIter<int> ite(new int(8));
cout<<func(ite); //输出8
  • 注意点
    func()的含绘制必须加上关键词typename,因为T是一个template参数,但它被编译器特例化之前,编译器对T一无所知。关键词typename的作用是告诉编译器这是一个类型,才能通过编译
<2>第二个限制坑点-不是所有迭代器都是class type,原生指针就不是

不是所有迭代器都是class type,原生指针就不是,可不是class type,就无法为他定义内嵌类型,但STL(及整个泛型思维)绝对必须接受原生指针作为一种迭代器,所以上面还不够。

  • 解决坑点
    方法:偏特化(template partial specialization)
  • 思想方法
    原生指针并非class,因此无法为他们定义内嵌类型,现在,可以针对迭代器template参数为指针设置特化版的迭代器了
template <class I>
struct iterator_traits  // traits 意为特性
{
	typedef typename I::value_type  value_type;	
};

这个所谓traits意义是:如果I定义有自己的value_type,那么通过这个traits的作用,萃取出来的value_type就是I::value_type,换句话说,如果I有自己的value_type,先前哪个func()可以改写成这样:(多了这一层,那么traits可以拥有特例化版本)

template <class I>
typename iterator_traits<I>::value_type  //这一样是返回值类型
func(I ite)
{
	return *ite;
}

现在做特例化版本如下:

template <class T>
struct iterator_traits<T*>  //偏特化版本,迭代器是原生指针
{
	typedef T value_type;
};
  • 结果
    于是,原生int*虽然不是一种class type,也可以通过traits取其value_type,这就解决了先前的问题
<3>第三个限制坑点-如果针对"指向常数对象的指针(point-to-const)"获得的值带const不是我们期望的
  • 举例
iterator_traits<const int*>::value_type  获得的是const int 而非int
  • 解决方法
    只需要设计一个特例化版本
template <class T>
struct iterator_traits<const T*>   //偏特化-当迭代器是point-to-const版本时,萃取出来T,
									//而非const T
{
	typedef T value_type;  
};

(2)最常用到的迭代器类型有五种:

在这里插入图片描述

<1>value_type
  • 概念介绍
    代指迭代器所指对象的类型
  • 意义
    任何一个跟stl完美搭配的class,都应该定义自己的value_type内嵌类型
<2>difference_type
  • 概念介绍
    表示两个迭代器之间的距离,因此它可以用来表示一个容器的最大容量,因为对于连续的容器而言,头尾之间的距离就是最大容量

  • 举例用法
    若一个泛型算法提供计数功能,例如STL的count(),其返回值就必须使用迭代器的difference_type

template<class I,class T>
typename iterator_traits<I>::difference_type //这一整行是返回值类型
count(I first,I last ,const T& value)
{
	typename iterator_traits<I>::difference_type n = 0;
	for(;first != last ;++first)
		if(*first == value)
			++n;
	return n;
}
  • difference_type针对原生指针的两种特化(以C++内建的ptrdiff_t作为原生指针的difference_type)
template<class T>
struct iterator_traits
{
	...
	typedef typename I::difference_type difference_type;
};

①针对原生指针设计的偏特化版本

template<class T>
struct iterator_traits<T*>
{
	...
	typedef ptrdiff_t difference_type;
};

②针对原生的pointer-to-const二设计的偏特化

template<class T>
struct iterator_traits<const T*>
{
	...
	typedef ptrdiff_t difference_type;
};
  • 总结
    现在当我们需要任何迭代器I的difference_type,可以这么写
typename iterator_traits<I>::difference_type;
<3>pointer_type
  • 作用
    传回一个pointer,指向迭代器所指之物
  • 举例
Item& operator*() const  {return *ptr;}  //这个就是reference_type
Item* operator->() const {return  ptr;}  //这个就是pointer_type
  • 把reference_type和pointer_type都加入到traits里面
template <class I>
struct iterator_traits
{
	...
	typedef typename I::pointer      pointer;
	typedef typename I::reference    reference;
};
  • 针对原生指针的两种特化
    ①针对原生指针的偏特化
template <class I>
struct iterator_traits<T*>
{
	...
	typedef typename T*      pointer;
	typedef typename T&      reference;
};

②针对原生的pointer-to-const的偏特化

template <class I>
struct iterator_traits<const T*>
{
	...
	typedef typename T*      pointer;
	typedef typename T&      reference;
};
<4>reference_type
  • 原理
    当我们要返回可修改的迭代器mutable iterator时,获得应该是一个左值,因为右值不允许赋值操作(assignment),左值才允许。
  • 解决方法
    C++中,函数要返回左值,都是以传引用的凡是。托value_type是T,那么*p的类型不该是T,而是T&;同理,若是constant iterator,*p的类型那就是const T&,而不是const T
<5>iterator_category
  • 迭代器分类(根据移动特性和操作)
    ①Input iterator: 只读的迭代器对象
    ②Output iterator: 只写的迭代器对象
    ③Forward iterator:在此迭代器上可进行读写操作
    ④Bidirectional iterator: 可双向移动
    ⑤Random Access iterator:前四种值提供一部分指针算数能力(举例:前三种支持operator++,第四种再加上operator–),第五种则覆盖所有指针算数能力,包括:p+n,p-n,p[n],p1-p2,p1<p2

  • 迭代器的概念和强化
    最高等级的迭代器类型并不代表最佳
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022-12版本的Rstudio它来了,它喊我升级了

1. Rstudio喊我升级 最近每一次打开Rstudio&#xff0c;总是推送给我最新版的Rstudio&#xff1a; 它之前不是这样的&#xff0c;那时候它所在的公司还叫Rstudio&#xff0c;现在改名叫Posit了&#xff0c;就开始推送了&#xff0c;也许它认为是重大的更新&#xff0c;也许他能…

【vue面试题-vuex】

vuex1.vuex是什么&#xff1f;怎么使用&#xff1f;哪种功能场景使用它&#xff1f;2.vuex有哪几种属性&#xff1f;3.Vue.js中ajax请求代码应该写在组件的methods中还是vuex的actions中&#xff1f;4.Vuex解决了什么问题&#xff1f;5.Vuex中状态储存在哪里&#xff0c;怎么改…

【LeetCode】1739. 放置盒子

1739. 放置盒子 题目描述 有一个立方体房间&#xff0c;其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子&#xff0c;每个盒子都是一个单位边长的立方体。放置规则如下&#xff1a; 你可以把盒子放在地板上的任何地方。 如果盒子 x 需要放置在盒子 y 的顶部&…

【webpack】cjs运行时分析

准备工作&#xff08;接上篇文章的示例也可以&#xff09;&#xff1a; 1. 在index.js文件中引入任一js文件 import sum from ./sum;const result sum(1,2); console.log(result);2. sum文件 const sum (a, b) > {return ab; }export default sum3. build.js文件 const…

离子交换法深度剖析

离子交换法 是一种借助于离子交换剂上的离子和污水中的离子进行交换反应而除去污水中有害离子的方法。 离子交换法的特点 离子交换过程是一种特殊的吸附过程&#xff0c;在许多方面与吸附过程类似。 与吸附法比较&#xff0c;其特点是:它主要吸附污水中的离子化物质&#xff…

怎样做一个不会被淘汰的车载诊断工程师

步入中年&#xff0c;不可避免会接触到所谓的中年危机&#xff0c;时刻在提醒自己提高自己的护城河&#xff0c;增强核心竞争力。但是这种事情也不是靠空想&#xff0c;还是要功夫下在平时。 自己是在2016年开始接触车载诊断方面&#xff0c;从事过诊断范畴的开发、测试、偏系…

程序员的圣诞节是怎么样的?

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 一、前言 圣诞节&#xff0c;先在这里祝大家圣诞节快乐~~&#xff0c;用英语来表达就是 Merry Christmas ~~&#xff0c; 为了贴合这个氛围&#xff0c;今天分享种用 Python 绘制圣诞树的方法。 最近用代码绘画圣诞…

非常易用的网络路径中的网络延迟测试和监控以及自动发送报告工具

非常易用的网络路径中的网络延迟测试和监控以及自动发送报告工具。 作为网络管理员或网络工程师&#xff0c;时刻关注网络的交付速度至关重要。不仅需要确保自己有良好的响应时间&#xff0c;还需要确保网络的速度足以满足用户通信所需的每一条路径。而手动测试每个路径将占用…

SpringBoot+Vue项目医院体检中心管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

电脑文件数据恢复方法是什么?未备份电脑文件数据恢复的七种方法

在日常生活中&#xff0c;我们总会遇到这样或那样的事情&#xff0c;比如在使用电脑过程中出现文件数据丢失情况&#xff0c;那么在未备份文件下电脑文件数据丢失怎么恢复&#xff1f;电脑文件数据恢复方法有哪些&#xff1f;这里将根据不同情况分享不同的电脑文件数据恢复方法…

L05_课后练习_波士顿房价预测

波士顿房价预测 1.导入所需要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import random from sklearn.model_selection import train_test_split2.读入数据 feature pd.read_csv("../data/boston.csv") feature…

Postgresql源码(95)优化器关键数据结构实例

1 测试数据 drop table student; create table student(sno int primary key, sname varchar(10), ssex int); insert into student values(1, stu1, 0); insert into student values(2, stu2, 1); insert into student values(3, stu3, 1); insert into student values(4, st…

Linux的环境变量

目录 什么是环境变量&#xff1f; 那么如何添加自己的程序到命令行上&#xff0c;可以直接执行&#xff1f; 如何查看环境变量&#xff1f; 如何定义环境变量&#xff1f; C语言如何获取环境变量&#xff1f; 什么是环境变量&#xff1f; 在回答这个问题之前&#xff0c;可…

【Linux】之systemd与systemctl

文章目录一、systemd1. systemd 守护进程管理 Linux 的启动2. systemd 提供的功能:3. systemd 使用单元来管理不同类型的对象。4. 服务单元信息二、systemctl1. systemctl输出中的服务状态2. 列出servera上安装的所以服务单元3. 列出servera上所有活动和不活动的套接字单元4.1 …

存档鉴未来,新时代电子档案长期保存之道

&#xff08;一&#xff09;电子档案单套制是未来档案管理的趋势 在政府和企业端&#xff0c;办公体系的信息化&#xff0c;电子档案的单套制实施&#xff0c;极大地提高了事务办理的效率&#xff0c;同时节约了大量纸质文件的使用成本。 在政务领域&#xff0c;单套制的推行…

Day840.原子类-Java 并发编程实战

原子类 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于原子类。 一个累加器的例子&#xff0c;示例代码如下&#xff1a; 在这个例子中&#xff0c;add10K() 这个方法不是线程安全的&#xff0c;问题就出在变量 count 的可见性和 count1 的原子性上。 可见性问题…

Java7的异常处理新特性addSuppressed()方法

学习使用Java7新语法try-with-resources&#xff0c;在查看编译文件时&#xff0c;接触到addSuppressed()方法。记录一下使用方式。 先来看一段代码&#xff1a; private static void testt() {try (InputStream is CatchTest.class.getClassLoader().getResourceAsStream(&…

ThinkPHP 多应用模式初探

还是很久以前用tp3.0开发过项目&#xff0c;之后就再没使用过&#xff0c;现在tp都更新到6了&#xff0c;与之前差距很大&#xff0c;需要重新练习掌握最新的tp框架使用及特性。 目录 1.安装框架 2.安装多应用模式扩展think-multi-app 3.目录结构修改并创建应用子目录 4.应…

年后市场将反弹?服装人做好这些准备,才能赚到2023年第一桶金!

目前&#xff0c;随着防疫政策精准落地、逐步放开&#xff0c;人们对疫情的科学认知不断更新&#xff0c;市场活跃度正逐步恢复。秦丝通过与数万服装老板沟通交流&#xff0c;发现新的模式也在渐渐兴起&#xff0c;国内服装市场将有望迎来反弹。 1、消费氛围活跃&#xff0c;市…

善网ESG周报(第六期)

ESG报告&#xff1a; 宁夏建投城运首份社会责任&#xff08;ESG&#xff09;报告正式发布 12月20日&#xff0c;宁夏建投城市运营管理有限公司发布首份ESG报告。报告显示&#xff0c;其公司将业务与环境保护、社会责任、公司治理相结合打造一条绿色发展道路。 国寿股权投资发…