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

深入浅出之STL源码分析8_三个指针

引言

在第一篇文章 深入浅出之STL源码分析1_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源码底层到底做了什么?把对应的数据插入到了哪个地址了?

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

下面开始讲解问题4.由于这个的内容将会把vector的所有源码都呈现出来,所以这个将会分不同的小节来进行讲解。

从push_back源码开始看起

#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;
}

向里继续看源码,

看到我们这里会调用push_back的这个函数:参数是个右值引用,所以接的是右值,而我们传进来的是22,确实是个右值。

#if __cplusplus >= 201103Lvoidpush_back(value_type&& __x){ emplace_back(std::move(__x)); }

 我们再来继续追踪这个 emplace_back源码:

通过这个源码我们可以看到有几个重要的点

1.开头的这种写法是什么意思?

#if __cplusplus >= 201103L

template<typename _Tp, typename _Alloc>

template<typename... _Args>

为啥这个类成员函数的实现的时候,怎么有两个template<>,这个我们可以看下成员函数的声明,就很清楚了,
 


#if __cplusplus >= 201103Lvoidpush_back(value_type&& __x){ emplace_back(std::move(__x)); }template<typename... _Args>
#if __cplusplus > 201402Lreference
#elsevoid
#endifemplace_back(_Args&&... __args);
#endif

也就是类成员函数声明的时候,每个成员函数又可以有自己的模版参数,比方这里当 

#if __cplusplus >= 201103L的时候,

template<typename... _Args>

类成员函数有了自己的模版参数,所以才有了上面函数在实现的时候,带了两个template<>,一个是整个类的,一个是类成员函数自己的。

这里我们可以写一个简单的小demo来看下。

2.this->_M_impl._M_finish != this->_M_impl._M_end_of_storage 这个又是什么东西? 

http://www.xdnf.cn/news/5880.html

相关文章:

  • PostgreSQL 恢复信息函数
  • Android Exoplayer多路不同时长音视频混合播放
  • window 显示驱动开发-报告图形内存(一)
  • ElasticSeach快速上手笔记-入门篇
  • VScode 的插件本地更改后怎么生效
  • 嵌入式学习--江协51单片机day5
  • React百日学习计划——Deepseek版
  • 销量预测评估指标
  • 【工作记录】Kong Gateway 入门篇之部署及简单测试
  • mpegts.js 播放flv视频报错:PIPELINE_ERROR_DECODE: video decode error!
  • FlashInfer - 安装
  • 理解 Open vSwitch (OVS)
  • 一键转换上百文件 Word 批量转 PDF 软件批量工具
  • 大模型——Crawl4AI为 LLM 和 RAG 准备高质量网页数据
  • ‌Element UI 双击事件(@cell-dblclick 与 @row-dblclick)
  • 函数式方法的实现(JDK8+)
  • 洛谷 P3374 【模板】树状数组 1(树状数组解法)
  • C#高级编程:设计模式原则
  • 第28节:现代CNN架构-ResNet与残差连接
  • Android加固工具测评:易盾、顶象、360加固哪款更好用?
  • 【源码+文档+调试讲解】党员之家服务系统小程序1
  • 如何同步虚拟机文件夹
  • Linux精确列出非法 UTF-8 字符的路径或文件名
  • 从虚拟现实到混合现实:沉浸式体验的未来之路
  • 【TMFN】一种基于文本的多模态融合网络,具有多尺度特征提取和无监督对比学习,用于多模态情感分析
  • Day1 时间复杂度
  • 3.2 一点一世界
  • mysql8常用sql语句
  • Java大师成长计划之第21天:Spring Boot快速入门
  • 【HarmonyOS】ArkTS开发应用的横竖屏切换