STL-需求分析

本小节主要是对要实现的各个功能梳理,理解各个设计之间的关联。(未完结)

1 list数据结构

可以毫不夸张的说,我们整个项目都是围绕list展开的。因此,我们首先得清楚要使用哪种list。

有请灵魂画手登场:
在这里插入图片描述

这是一个双向链表,每个节点包含三个信息:指向上一个节点的指针、指向下一个节点的指针、节点包含的数据。

在SGI STL中,链表被设计成双向循环链表:
在这里插入图片描述

所有可能出现的操作如下:
(1)数据结构(节点等信息)
(2)迭代器
(3)内存管理
(4)元素操作

2 关注容器:区别“链表节点”和“链表”

2.1 链表节点

当我们提到“链表节点”时,我们更多指的是如下结构:(对于一个双向循环链表的节点,需要两个指针和一个数据节点。)

template <class T>
struct __list_node{//定义一个双向链表_list_node<T> * prev;//上一个节点_list_node<T> * next;//下一个节点T data;
};

我们可以对照vector和其内部的元素来理解上述的设计。

1)因为C++本身不提供节点类型(更确切的说,list节点并不是基本数据类型,而是复合类型。)
2)相比vector存储仅需要连续的存储空间,list的创建,多了一步节点类型的定义。

2.2 链表

而当我们谈到“链表”时,我们指的不仅仅是多个“链表节点”构成数据,还包括数据存储和释放,访问等其他相应操作,包括我们提到的容器和其对迭代器提供的支持。
具体来说,“链表”相关的支持包括如下内容:
1) 访问方式(迭代器实现)
2) 构造与内存管理
3) 元素操作(每个容器针对性实现)
这些内容联合“链表节点”,共同构成了完整的list容器。

3 关注迭代器:由容器定义具体的迭代访问方式,由迭代器文件设计通用接口

在开始学习前,请记住:迭代器设计与编译器密切相关!

3.1 函数返回值推导

迭代器的设计核心,就是提供通用接口。你或许会想,直接使用模板不就行了吗?

(1)这里提一个模板函数的例子:

#include <iostream>
#include <list>using namespace std;template<typename T>
T sum(T a, T b){return (T)(a+b);
}int main(){int a,b;a = 10;b = 20;cout << sum(a,b) <<endl;}

这样看来,函数似乎没有任何问题。

(2)那么,我们再来看另一个例子:

#include <iostream>using namespace std;template <typename T>
class A{public:T * ptr; //指向数据的指针A(T*p=0): ptr(p) {} //等价于 A(T*p=0){ptr=p;};T & operator * () const {return * ptr;} // dereference
};template <typename T>
T getValue(T ite){return * ite;
}int main(){A<int> ite(new int(10));cout << getValue(ite) << endl;}

上述代码看着没什么问题,但是实际运行的时,就会出现报错。
注意,这是因为:getValue(ite) 中,通过参数推导机制,T=A,但是*ite的类型却是 int 类型。因此,参数推导就出现了问题。

(3)但是,如果使用内嵌型别,可以解决上述问题。

#include <iostream>using namespace std;template <typename T>
class A{public:typedef T value_type;T * ptr; //指向数据的指针A(T*p=0): ptr(p) {} //等价于 A(T*p=0){ptr=p;};T & operator * () const {return * ptr;} // dereference
};template <typename T>
typename T::value_type getValue(T ite){return * ite;
}int main(){A<int> ite(new int(10));cout << getValue(ite) << endl;}

注意:typename关键字用于定义紧接其后的那个“T::value_type”,是一个 型别 ,而不是 类、变量或函数。(因为模板在被编译器具象化前,编译器对T一无所知,并不知道“T::value_type”是什么东西。)

3.2 模板偏特化

上述嵌型别的实现,需要class type。而native pointer不是class type,那怎么给这个native pointer添加类型型别呢?
实际上,我们不需要考虑修改native pointer,我们只需要利用模板的偏特化机制即可。
常见的偏特化是直接给T制定一个类型。其实不然,partial specialization是提供另一份template定义式,而其本身仍为templatized。

#include <iostream>using namespace std;template <typename T>
class A{public:A(){cout << "origin version" <<endl;}};template <typename T>
class A<T*>{public:A(){cout << "partial version" <<endl;      }
};int main(){A<int> a1;//调用原始版本,参数推导T=intA<int *> a2;//调用偏特化版本,参数推导T*表示原生指针,T代表指针指向的类型
}

3.3 统一接口从容器定义的迭代器中“萃取”及迭代器相应型别

注意:具体的迭代方式由容器设计指定!!!
这里,定义了迭代器应该拥有的定义。

3.4 要点

迭代器接口和相应型别的设计,是基于编译器,或者说,是妥协编译器而实现的。

迭代器的设计,巧妙地利用了编译器“参数推导”、“class type”、类“继承”机制和函数“重载”机制。

1)class type一是为了实现内嵌型别的定义,二是为了实现继承(可以使用其父类的函数)。
2)函数重载机制实现了在编译阶段(提高程序执行效率)选择正确的函数版本。

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

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

相关文章

STM32进阶 定时器3 通用定时器 案例1:LED呼吸灯——PWM脉冲

功能 它有基本定时器所有功能&#xff0c;还增加以下功能 TIM2、TIM3、TIM4、TIM5 多种时钟源&#xff1a; 外部时钟源模式1&#xff1a; 每个定时器有四个输入通道 只有通道1和通道2的信号可以作为时钟信号源 通道1 和通道2 的信号经过输入滤液和边缘检测器 外部时钟源…

Chrome控制台 网站性能优化指标一览

打开chrome-》f12/右键查看元素-》NetWrok/网络 ctrlF5 刷新网页&#xff0c;可以看到从输入url到页面资源请求并加载网页&#xff0c;用于查看资源加载&#xff0c;接口请求&#xff0c;评估网页、网站性能等&#xff0c;如下图&#xff1a; request、stransferred、resour…

buu ciscn_2019_ne_5

下载附件然后checksec一下如图 32位的程序&#xff0c;nx保护开的&#xff0c;存在栈溢出&#xff0c;拖进ida32中看看 梳理思路&#xff1a; 简单分析并写个注释&#xff0c;这边梳理一下大致流程&#xff0c;先是输入一字符串&#xff0c;然后比对&#xff0c;然后再选择相…

如何降低DApp开发中的Gas费消耗?

Gas费是链上运行DApp时的一项关键成本&#xff0c;直接影响用户体验和应用的吸引力。过高的Gas费可能导致用户流失&#xff0c;尤其在交易密集型应用中。因此&#xff0c;优化Gas费已成为DApp开发者的重要任务。那么&#xff0c;怎样才能有效降低Gas费消耗呢&#xff1f; 1. 优…

CC工具箱使用指南:【湖北省村规结构调整表(D)】

一、简介 群友定制工具。 工具根据输入的现状用地和规划用地图层&#xff0c;生成村域和村庄建设边界内的结构调整表。 二、工具参数介绍 点击【定制2】组里的【湖北省村规结构调整表(D)】工具&#xff1a; 即可打开下面的工具框界面&#xff1a; 1、现状用地图层 2、现状…

逗号分隔、多级位置及局部更新的Sql实现

一、逗号分隔的字符串多值查询 1&#xff0c;背景 假设有一个表location_type_relation&#xff0c;其中有1个字段location_ids&#xff0c;用逗号分隔了多个标签&#xff0c;还有1个字段type_ids&#xff0c;也是用逗号分隔了多个标签 2&#xff0c;需求 现在要判断locat…

flink-connector-mysql-cdc:01 mysql-cdc础配置代码演示

flink-connector-mysql-cdc&#xff1a; 01 mysql-cdc基础配置代码演示02 mysql-cdc高级扩展03 mysql-cdc常见问题汇总04 mysql-cdc-kafka生产级代码分享05 flink-kafka-doris生产级代码分享06 flink-kafka-hudi生产级代码分享 flink-cdc版本&#xff1a;3.2.0 flink版本&…

工业-实时数据采集

1.编写新的 Flume 配置文件&#xff0c;将数据备份到 HDFS 目录 /user/test/flumebackup 下&#xff0c;要求所有主题 的数据使用同一个 Flume配置文件完成。 1. 配置概览 Flume 的主要任务是从多个来源&#xff08;如日志文件&#xff09;读取数据&#xff0c;经过处理后通过…

mmdet 加载预训练模型多卡训练过程中,存在显卡占用显存不均匀

1. 问题描述 基于mmdet https://github.com/open-mmlab/mmdetection代码仓库&#xff0c;修改了自己的检测代码&#xff0c;加载了预训练模型&#xff0c;进行分布式训练。 在训练过程中&#xff0c;出现了显卡的占用显存不均匀的问题。 如图所示&#xff0c;可以看到显卡2 占…

使用ALB将HTTP访问重定向至HTTPS

HTTPS是加密数据传输协议&#xff0c;安全性高。当企业进行HTTPS安全改造后&#xff0c;为了方便用户访问&#xff0c;可以使用ALB在用户无感知的情况下将HTTP访问重定向至HTTPS。 前提条件 您已创建ALB实例&#xff0c;并为该实例添加了HTTP监听和监听端口为443的HTTPS监听。…

力扣92.反转链表Ⅱ

题目描述 题目链接92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left …

Java版-速通ETL工具中简单的DAG执行实现

DAG作用 在ETL工具中&#xff0c;一般使用DAG图来进行任务的配置&#xff0c;将任务配置在有向无环图中&#xff0c;执行时候从首层节点&#xff0c;依次往下&#xff0c;下层节点的执行依赖于父节点是否执行完毕的状态&#xff0c;当最后一层的节点执行完成之后&#xff0c;整…

Web安全深度剖析

1.Web安全简介 ​ 攻击者想要对计算机进行渗透&#xff0c;有一个条件是必须的&#xff0c;就是攻击者的计算机与服务器必须能够正常通信&#xff0c;服务器与客户端进行通信依靠的就是端口。 ​ 如今的web应该称之为web应用程序&#xff0c;功能强大&#xff0c;离不开四个要…

策略模式的理解和实践

在软件开发中&#xff0c;我们经常遇到需要在不同算法之间进行选择的情况。这些算法可能实现相同的功能&#xff0c;但使用不同的方法或逻辑。为了增强代码的可维护性和可扩展性&#xff0c;我们可以使用设计模式来优化这些算法的实现和管理。策略模式&#xff08;Strategy Pat…

在 Linux 环境下搭建 OpenLab Web 网站并实现 HTTPS 和访问控制

实验要求 综合练习&#xff1a;请给openlab搭建web网站 ​ 网站需求&#xff1a; ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c…

Java开发利器:IDEA的安装与使用(下)

文章目录 8. 快捷键的使用8.1 常用快捷键8.2 查看快捷键8.3 自定义快捷键8.4 使用其它平台快捷键 9. IDEA断点调试(Debug)9.1 为什么需要Debug9.2 Debug的步骤9.3 多种Debug情况介绍9.3.1 行断点9.3.2 方法断点9.3.3 字段断点9.3.4 条件断点9.3.5 异常断点9.3.6 线程调试9.3.7 …

非对称任意进制转换器(安卓)

除了正常进制转换&#xff0c;还可以输入、输出使用不同的数字符号&#xff0c;达成对数值进行加密的效果 点我下载APK安装包 使用unity开发。新建一个c#代码文件&#xff0c;把代码覆盖进去&#xff0c;再把代码文件添加给main camera即可。 using System.Collections; usin…

神经网络入门实战:(十四)pytorch 官网内置的 CIFAR10 数据集,及其网络模型

(一) pytorch 官网内置的网络模型 图像处理&#xff1a; Models and pre-trained weights — Torchvision 0.20 documentation (二) CIFAR10数据集的分类网络模型&#xff08;仅前向传播&#xff09;&#xff1a; 下方的网络模型图片有误&#xff0c;已做修改&#xff0c;具…

linux 系列服务器 高并发下ulimit优化文档

系统输入 ulimit -a 结果如下 解除 Linux 系统的最大进程数 要解除或提高 Linux 系统的最大进程数&#xff0c;可以修改 ulimit 设置和 /etc/security/limits.conf 文件中的限制。 临时修改 ulimit 设置 可以使用 ulimit 命令来查看和修改当前会话的最大进程数&#xff1a; 查…