当前位置: 首页 > article >正文

深入浅出之STL源码分析4_类模版

1.引言

我在上面的文章中讲解了vector的基本操作,然后提出了几个问题。

STL之vector基本操作-CSDN博客

1.刚才我提到了我的编译器版本是g++ 11.4.0,而我们要讲解的是STL(标准模板库),那么二者之间的关系是什么?STL安装后我们到哪里去看源码?

2.我们引入了头文件#include<vector>

这里的vector的内容是什么?

3.vector<int> test_vector; 这中定义方式是干什么?<>的作用是什么?

4.test_vector.push_back(22); 对于stl源码底层到底做了什么?把对应的数据插入到了哪个地址了?

什么时候分配的虚拟内存?什么时候扩容?什么时候会分配物理内存?

我现在来一一解答,但是我现在不是从第一个问题讲起,而是先讲下第三个问题。

3.vector<int> test_vector; 这中定义方式是干什么?<>的作用是什么?

这样的话,我就要从类模版讲起来,因为这个是类模板的实例化,生成了一个类对象。

那么我们先从源码看起,看看类模板是怎么定义的?

2.类模板的声明

我们看下vector的定义:

看代码是继承了_Vector_base,我们今天就从_Vector_base看起,来一步步解开模版的神秘面纱。

/// See bits/stl_deque.h's _Deque_base for an explanation.template<typename _Tp, typename _Alloc>struct _Vector_base{typedef typename __gnu_cxx::__alloc_traits<_Alloc>::templaterebind<_Tp>::other _Tp_alloc_type;typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointerpointer;public:typedef _Alloc allocator_type;_Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT: _M_impl(__a) { }}

 我没有把源码的定义都粘贴过来,因为代码量比较大

3. 类模板成员函数的定义

template<typename T1, typename T2>

struct _Vector_base{

}

我们知道这里进行了类模板的声明。在类模版的内部,T1和T2可以像其他任何类型一样,用于声明成员变量和成员函数。

这里要注意struct的成员默认是public的:

用这个模版类型 _Alloc 直接或者间接的 定义了三个成员变量一个成员函数。

我们先看这个

 typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointerpointer;

这里的typedef定义一个新的类型,特别注意这个typename,主要是为了声明后的是一个类型,
这个typename可以参考,模版中的typename关键字详解-CSDN博客

我们再看下后面两个:

public:typedef _Alloc allocator_type;_Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT: _M_impl(__a) { }

typedef就是定义新的类型,allocator_type 就是分配器类型,主要是分配内存使用:

下面是一个构造函数,直接使用这个allocator_type也就是使用了第二个模版参数类型 _Alloc。

而我们的这个例子中,_Vector_base相关的成员函数都是内联实现的,为了介绍的全面性,我们找一个成员函数,不是内联实现的来讲解下,我们抽取一个vector的reserve方法,来讲解,继续看下源码。

//vector的成员函数声明
// /usr/include/c++/11/bits/stl_vector.h
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >class vector : protected _Vector_base<_Tp, _Alloc>{public:voidreserve(size_type __n);}

我们看到reserve函数里的参数,没有用到模版参数,但是它的实现分离的时候,还是要按照正规的标准写法来写,它的实现如下所示:

// /usr/include/c++/11/bits/vector.tcc
template<typename _Tp, typename _Alloc>voidvector<_Tp, _Alloc>::reserve(size_type __n){//去掉中间代码...}

我们就可以知道如何定义一个类模版成员函数了。

在函数的开头,要写上模版的开头,

template<typename _Tp, typename _Alloc>

然后写函数返回值, void

然后写类名,也就是函数的限制符,属于哪个 类的,这里很关键,要带着模版参数。

vector<_Tp, _Alloc>::

4.类模版的使用

我们看上面的例子,已经定义了类模版,那么如何使用类模版呢?

为了使用类模版对象,你必须显示地制指定模版实参。

我们再来看下vector的定义

//vector的成员函数声明
// /usr/include/c++/11/bits/stl_vector.h
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >class vector : protected _Vector_base<_Tp, _Alloc>{public:voidreserve(size_type __n);}

我们看到它需要两个模版实参,但是因为第二个模版参数有了默认值,typename _Alloc = std::allocator<_Tp>

所以我们指定一个就可以了。vector<int> test_vector;

#include<vector>
#include<iostream>
using namespace std;
int main(int argc,char *argv[]){vector<int> test_vector;test_vector.push_back(22);std::cout << test_vector.back() << std::endl;return 0;
}

这里的语法就是,vector后面要跟<>,里面放模版实参,多个实参用,分割开。当然这里的实参一般是一个类型。这里就是典型的显示实例化的语法,也叫做(按需实例化),

今天这篇文章就讲解到这里,在下面我们会继续讲解,实例化和特化,以及全特化,偏特化等概念。

深入浅出之STL源码分析3_类模版实例化与特化-CSDN博客

相关文章:

深入浅出之STL源码分析4_类模版

1.引言 我在上面的文章中讲解了vector的基本操作&#xff0c;然后提出了几个问题。 STL之vector基本操作-CSDN博客 1.刚才我提到了我的编译器版本是g 11.4.0&#xff0c;而我们要讲解的是STL&#xff08;标准模板库&#xff09;&#xff0c;那么二者之间的关系是什么&#x…...

探索科技的前沿动态:科技爱好者周刊

探索科技的前沿动态:科技爱好者周刊 在信息爆炸的时代,我们每时每刻都被新技术、新理念包围。而如何在这纷繁复杂的信息中找到对自己有价值的内容,成了一大挑战。今天,我们要介绍的是一个宝贵的资源——科技爱好者周刊,它致力于为科技爱好者提供优质的科技资讯,每周五发…...

初学者入门指南:什么是网络拓扑结构?

初学者入门指南&#xff1a;什么是网络拓扑结构&#xff1f; 在构建或学习计算机网络时&#xff0c;一个绕不开的核心概念便是“网络拓扑结构”&#xff08;Network Topology&#xff09;。它决定了网络中各个设备如何连接、通信以及如何扩展。理解网络拓扑不仅有助于我们更清…...

在 Vue 3 中实现刮刮乐抽奖

&#x1f389; 在 Vue 3 中实现刮刮乐抽奖 当项目中需要做一些活动互动页时&#xff0c;需要实现刮刮乐&#xff0c;请看如下效果&#xff1a; 这里感谢github用户Choicc分享的组件&#xff0c;具体可点击传送门查看 1. 引入组件 将/src/components下ScratchCard.vue复制到自…...

Satori:元动作 + 内建搜索机制,让大模型实现超级推理能力

Satori&#xff1a;元动作 内建搜索机制&#xff0c;让大模型实现超级推理能力 论文大纲一、背景&#xff1a;LLM 推理增强的三类方法1. 基于大规模监督微调&#xff08;SFT&#xff09;的推理增强2. 借助外部机制在推理时进行搜索 (RLHF / 多模型 / 工具)3. 现有局限性总结 二…...

SDC命令详解:使用all_outputs命令进行查询

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html all_outputs命令用于创建一个输出端口对象集合&#xff0c;关于设计对象和集合的更详细介绍&#xff0c;可以参考下面的博客。 Synopsys&#xff1a;设计对象https://chenzhang.blog.csdn…...

printf调试时候正常,运行时打印不出来

问题是在添加了 printf 功能后&#xff0c;程序独立运行时无法正常打印输出&#xff0c;而调试模式下正常。这表明问题可能与 printf 的重定向实现、标准库配置、或编译器相关设置有关。 解决&#xff1a; 原来是使用 Keil/IAR&#xff0c;printf可能需要启用 MicroLIB 或正确…...

解决 TimeoutError: [WinError 10060] 在 FramePack项目中连接 Hugging Face 超时的问题

#工作记录 以下是针对 TimeoutError: [WinError 10060] 的完整排查方案&#xff0c;适用于 FramePack项目中。 &#xff08;一般该错误的发生原因请重点排查Hugging Face模型仓库受限需要登录的情形&#xff09; FramePack项目参考资料 FramePack部署&#xff08;从PyCharm解…...

分布式-Redis分布式锁

Redis实现分布式锁优点 &#xff08;1&#xff09;Redis有很高的性能&#xff1b; &#xff08;2&#xff09;Redis命令对此支持较好&#xff0c;实现起来比较方便 实现思路 &#xff08;1&#xff09;获取锁的时候&#xff0c;使用setnx加锁&#xff0c;并使用expire命令为锁…...

UniRepLknet助力YOLOv8:高效特征提取与目标检测性能优化

文章目录 一、引言二、UniRepLknet 的框架原理&#xff08;一&#xff09;架构概述&#xff08;二&#xff09;架构优势 三、UniRepLknet 在 YOLOv8 中的集成&#xff08;一&#xff09;集成方法&#xff08;二&#xff09;代码实例 四、实验与对比&#xff08;一&#xff09;对…...

自研时序大模型讲解(4月29日)直播回顾

4 月 29 日&#xff0c;清华团队揭秘&#xff1a;时序大模型如何让数据“活”起来线上直播圆满结束。清华大学软件学院博士生&#xff0c;IoTDB 原生机器学习引擎 AINode 研发同学刘雍在线上面向数千人次的时序数据分析人员与 AI 大模型行业关注者&#xff0c;就时序大模型的发…...

The Action Replay Process

Preface A commonly used inequality − x > ln ⁡ ( 1 − x ) , 0 < x < 1 -x > \ln(1 - x), \quad 0 < x < 1 −x>ln(1−x),0<x<1 Proof: Let f ( x ) ln ⁡ ( 1 − x ) x f(x) \ln(1 - x) x f(x)ln(1−x)x, for 0 < x < 1 0 < …...

k8s之ingress解释以及k8s创建业务的流程定义

matchLabels ingress Ingress 是反向代理规则&#xff0c;用来规定 HTTP/S 请求应该被转发到哪个 Service 上&#xff0c;比如根据请求中不同的 Host 和 url 路径让请求落到不同的 Service 上。 Ingress Controller 就是一个反向代理程序&#xff0c;它负责解析 Ingress 的反向…...

LVGL对象的盒子模型和样式

文章目录 &#x1f9f1; LVGL 对象盒子模型结构&#x1f50d; 组成部分说明&#x1f3ae; 示例代码&#x1f4cc; 总结一句话 &#x1f9f1; 一、样式的本质&#xff1a;lv_style_t 对象&#x1f3a8; 二、样式应用的方式&#x1f9e9; 三、样式属性分类&#xff08;核心&#…...

从0开始学习大模型--Day05--理解prompt工程

提示词工程原理 N-gram&#xff1a;通过统计&#xff0c;计算N个词共同出现的概率&#xff0c;从而预测下一个词是什么。 深度学习模型&#xff1a;有多层神经网络组成&#xff0c;可以自动从数据中学习特征&#xff0c;让模型通过不断地自我学习不断成长&#xff0c;直到模型…...

计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践

概述 设想一下&#xff0c;你在多地拥有多个仓库&#xff0c;要同时监控每个仓库的实时状况&#xff0c;这对于时间和精力而言&#xff0c;都构成了一项艰巨挑战。从成本和可靠性的层面考量&#xff0c;大规模部署计算设备也并非可行之策。一方面&#xff0c;大量计算设备的购…...

【计算机视觉】OpenCV项目实战:OpenCV_Position 项目深度解析:相机定位技术

OpenCV_Position 项目深度解析&#xff1a;基于 OpenCV 的相机定位技术 一、项目概述二、技术原理&#xff08;一&#xff09;单应性矩阵&#xff08;Homography&#xff09;&#xff08;二&#xff09;算法步骤&#xff08;三&#xff09;相机内参矩阵 三、项目实战运行&#…...

LAMMPS分子动力学基于周期扰动法的黏度计算

关键词&#xff1a;黏度,周期扰动法&#xff0c;SPC/E水分子&#xff0c;分子动力学&#xff0c;lammps 目前分子动力学计算黏度主要有以下方法&#xff1a;&#xff08;1&#xff09;基于 Green - Kubo 关系的方法。从微观角度出发&#xff0c;利用压力张量自相关函数积分计算…...

unity通过transform找子物体只能找子级

unity通过transform找子物体只能找子级&#xff0c;孙级以及更低级别都找不到&#xff0c;只能找到自己的下一级 如果要获取孙级以下的物体&#xff0c;最快的方法还是直接public挂载...

ThinkPad T440P如何从U盘安装Ubuntu24.04系统

首先制作一个安装 U 盘。我使用的工具是 Rufus &#xff0c;它的官网是 rufus.ie &#xff0c;去下载最新版就可以了。直接打开这个工具&#xff0c;选择自己从ubuntu官网下载Get Ubuntu | Download | Ubuntu的iso镜像制作U盘安装包即可。 其次安装之前&#xff0c;还要对 Thi…...

PostgreSQL给新用户授权select角色

✅ 切换到你的数据库并以超级用户登录&#xff08;例如 postgres&#xff09;&#xff1a; admin#localhost: ~$ psql -U postgres -d lily✅ 创建登录的账号机密吗 lily> CREATE USER readonly_user WITH PASSWORD xxxxxxxxxxx; ✅ 确认你授予了这个表的读取权限&#xf…...

嵌入式开发学习(阶段二 C语言基础)

C语言&#xff1a;第05天笔记 内容提要 分支结构 条件判断用if语句实现分支结构用switch语句实现分支结构 分支结构 条件判断 条件判断&#xff1a;根据某个条件成立与否&#xff0c;决定是否执行指定的操作。 条件判断的结果是逻辑值&#xff0c;也就是布尔类型值&#…...

【RAG技术全景解读】从原理到工业级应用实践

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1f6a8; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f50d; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解⚙️ 关键技术模块说明&#x1f504; 技术选…...

从人体姿态到机械臂轨迹:基于深度学习的Kinova远程操控系统架构解析

在工业自动化、医疗辅助、灾难救援与太空探索等前沿领域&#xff0c;Kinova轻型机械臂凭借7自由度关节设计和出色负载能力脱颖而出。它能精准完成物体抓取、复杂装配和精细操作等任务。然而&#xff0c;实现人类操作者对Kinova机械臂的直观高效远程控制一直是技术难题。传统远程…...

NX949NX952美光科技闪存NX961NX964

NX949NX952美光科技闪存NX961NX964 在半导体存储领域&#xff0c;美光科技始终扮演着技术引领者的角色。其NX系列闪存产品线凭借卓越的性能与创新设计&#xff0c;成为数据中心、人工智能、高端消费电子等场景的核心组件。本文将围绕NX949、NX952、NX961及NX964四款代表性产品…...

【Bootstrap V4系列】学习入门教程之 组件-输入组(Input group)

Bootstrap V4系列 学习入门教程之 组件-输入组&#xff08;Input group&#xff09; 输入组&#xff08;Input group&#xff09;Basic example一、Wrapping 包装二、Sizing 尺寸三、Multiple addons 多个插件四、Button addons 按钮插件五、Buttons with dropdowns 带下拉按钮…...

VS “筛选器/文件夹”

每天学习一个VS小技巧&#xff1a; 我在VS创建筛选器的时候&#xff0c;想要想要同步计算机上的文件目录&#xff0c;但是发现并未 同步。 例如我在这儿创建了一个筛选器IoManager 但是在UI这个文件夹里并未创建对应的IoManager文件夹 我右击也没有打开文件所在位置 然后我…...

RAG与语义搜索:让大模型成为测试工程师的智能助手

引言 AI大模型风头正劲&#xff0c;自动生成和理解文本的能力让无数行业焕发新生。测试工程师也不例外——谁不想让AI自动“看懂需求、理解接口、生成用例”&#xff1f;然而&#xff0c;很多人发现&#xff1a;直接丢问题给大模型&#xff0c;答案貌似“懂行”&#xff0c;细…...

从 JMS 到 ActiveMQ:API 设计与扩展机制分析(三)

三、ActiveMQ API 设计解析 &#xff08;一&#xff09;对 JMS API 的实现与扩展 ActiveMQ 作为 JMS 规范的一种实现&#xff0c;全面且深入地实现了 JMS API&#xff0c;确保了其在 Java 消息服务领域的兼容性和通用性。在核心接口实现方面&#xff0c;ActiveMQ 对 JMS 的 C…...

powerbuilder9.0中文版

经常 用这个版本号写小软件,非常喜欢这个开发软件 . powerbuilder9.0 非常的小巧,快捷,功能强大,使用方便. 我今天用软件 自己汉化了一遍&#xff0c;一些常用的界面都已经翻译成中文。 我自己用的&#xff0c;以后有什么界面需要翻译&#xff0c;再更新一下。 放在这里留个…...