STL_vector源码剖析

STL vector

STL2.91源码地址: https://github.com/lewischeng-ms/sgi-stl
侯捷老师用的是 2.91,不同版本的STL差异很大,靠后版本的STL用了太多typedef以及继承关系,导致可读性很差。
本文参考博客: https://blog.csdn.net/weixin_45389639/article/details/121618243

vector 源码

// vector源码
template<class T,class Alloc=alloc>
class vector
{
public:typedef T value_type;typedef value_type* iterator;typedef value_type& reference;typedef size_t size_type;
protected:iterator start;iterator finish;iterator end_of_storage;
public:iterator begin(){return start;}iterator end(){return finish;}size_type size()const{return (size_type)end_of_storage-begin();}bool empty()const{return begin()==end();}reference operator[](size_type n){return *(begin()+n);}reference front(){return *begin();}reference back(){return *(end()-1);}...
};

vector源码分析

vector中定义了三个指针: start 、finish 、 end_of_storage
sizeof(vector): 三个指针的大小
在这里插入图片描述

vector扩容:空间两倍增长

​ vector容器的迭代器start指向第一个元素,finish指向最后一个元素的下一个元素,满足了前闭后开特性,end_of_storage是vector的容量。vector在使用上是连续的,在实现上也是连续的,所以迭代器采用non-class类型。

// vector源码
template<class T,class Alloc=alloc>
class vector
{
public:typedef T value_type;typedef value_type* iterator;typedef value_type& reference;typedef size_t size_type;
protected:iterator start;iterator finish;iterator end_of_storage;
public:iterator begin(){return start;}iterator end(){return finish;}size_type size()const{return (size_type)end_of_storage-begin();}bool empty()const{return begin()==end();}reference operator[](size_type n){return *(begin()+n);}reference front(){return *begin();}reference back(){return *(end()-1);}...
};

vector.push_back()的方法,首先会判断end_of_storage是不是满了,满了的话就会扩容2倍再进行添加元素。注意:扩充的过程重并不是在原有空间后面追加容量,而是重新申请一块连续的内存空间,将原有的数据拷贝到新空间中,再释放原来空间中内存。所以扩充之后,原有的迭代器将会失效!

  void push_back(const T& x) {if (finish != end_of_storage) {construct(finish, x);++finish;}elseinsert_aux(end(), x);}

​insert_aux是vector容器用来在内部任意位置插入元素,内存不足的情况下会扩容。

template<class T, class Alloc>
void vector<T, Alloc>::insert_ux(iterator position, const T &x) {if (finish != end_of_storage) {     // 尚有备用空间,则将插入点后元素后移一位并插入元素construct(finish, *(finish - 1));   // 以vector最后一个元素值为新节点的初值++finish;T x_copy = x;copy_backward(position, finish - 2, finish - 1);*position = x_copy;} else {// 已无备用空间,则先扩容,再插入const size_type old_size = size();const size_type len = old_size != 0 ?: 2 * old_size:1;  // 扩容后长度为原长度的两倍iterator new_start = data_allocator::allocate(len);iterator new_finish = new_start;try {new_finish = uninitialized_copy(start, position, new_start);    // 拷贝插入点前的元素construct(new_finish, x);                                       // 插入新元素并调整水位++new_finish;//这个辅助还是不止被push_back调用,其他函数(insert)也会调用。 insert插入需要扩充数据,会有安插点之前和安插点之后//需要将安插点之后的元素也拷贝过来new_finish = uninitialized_copy(position, finish, new_finish);  // 拷贝插入点后的元素}catch (...) {// 插入失败则回滚,释放内存并抛出错误destroy(new_start, new_finish) :data_allocator::deallocate(new_start, len);throw;}// 释放原容器所占内存destroy(begin(), end());deallocate();// 调整迭代器start = new_start;finish = new_finish;end_of_storage = new_start + len;}
};

vector迭代器

列表的迭代器设置为class,因为列表的节点都是分离的
vector用指针就可以当作迭代器

class vector {
public:typedef T value_type;typedef const value_type* const_pointer;typedef value_type* iterator;};-------------------------------------------------//使用迭代器vector<int> vec;vecto<int>::iterator it = vec.begin();

算法使用vec的迭代器,需要知道迭代器的5个参数会将value_type* iterator迭代器丢给traits,
traits使用指针偏特化的版本 iterator_traits<T>*、

这一部分需要对萃取有一些了解: https://editor.csdn.net/md/?articleId=138084134
在这里插入图片描述

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

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

相关文章

记账本React案例(Redux管理状态)

文章目录 整体架构流程 环境搭建 创建项目 技术细节 一、别名路径配置 1.路径解析配置&#xff08;webpack&#xff09; &#xff0c;将/解析为src/ 2.路径联想配置&#xff08;vsCode&#xff09;&#xff0c;使用vscode编辑器时&#xff0c;自动联想出来src文件夹下的…

阿里云的应用型负载均衡,网络型负载均衡,传统型负载均衡

阿里云提供了几种不同类型的负载均衡服务&#xff0c;各有其特定的应用场景和性能特点。这些包括应用型负载均衡&#xff08;Application Load Balancer, ALB&#xff09;、网络型负载均衡&#xff08;Network Load Balancer, NLB&#xff09;和传统型负载均衡&#xff08;Clas…

四级英语之词类的确定

在四级英语中&#xff0c;确定词类的方法主要有以下几种&#xff1a; 通过句子结构确定&#xff1a; 当空格处的前面是冠词、形容词或及物动词时&#xff0c;空格处应当要填入名词。当空格处的前面是介词时&#xff0c;空格处是充当介词宾语的&#xff0c;应当填入一个名词或者…

Pytorch实用教程:nn.Linear内部是如何实现的,从哪里可以看到源码?

文章目录 nn.Linear简介nn.Linear 基本介绍nn.Linear 的参数nn.Linear源码解析查看源码的方法nn.Linear 的核心源码nn.Linear用法的示例代码示例说明示例代码代码解释nn.Linear简介 nn.Linear 是 PyTorch 中非常基础的一个模块,用于实现全连接层。下面我会详细解释它的内部实…

python利用urllib和xpath爬取并保存图片

概要 在网络时代&#xff0c;图片是信息传递的重要形式之一&#xff0c;而Python作为一种多用途的编程语言&#xff0c;可以用来编写爬虫从网页上获取图片&#xff0c;并保存到本地。本文将介绍如何使用Python爬虫实现这一功能&#xff0c;并探讨一些进阶技巧。 实现 &#x…

Open3D均值和中值滤波

一、代码 Python import open3d as o3d import numpy as npdef mean_filter(point_cloud, k=50):# 构建KDTreepcd_tree = o3d.geometry.KDTreeFlann(point_cloud)# 为每个点搜索k近邻points = np.asarray(point_cloud.points)filtered_points = np.zeros_like(points)for i i…

人生关卡设计:内在动力、外在挑战与成长路径的构建

人生被喻为一场旅程&#xff0c;其中充满了无数的关卡&#xff0c;这些关卡不仅是外在环境施加的挑战&#xff0c;更是个体内心动力驱动下自我设定的成长节点。本文旨在探讨人生关卡设计的概念&#xff0c;及其如何通过内在动力、外在挑战与成长路径的交织构建&#xff0c;塑造…

Linux + EC20 shell指令查看SIM卡信号强度

以A40i平台linux系统&#xff0c;移远EC20模块为例&#xff0c;看看如何查看SIM卡信号的强度&#xff1a; 命令&#xff1a; root$ cat /dev/ttyUSB2& root$ echo -e "ATCSQ\r\n" > /dev/ttyUSB2 得到&#xff1a; ATCSQ CSQ: 28,99 OK AATCSQ CSQ: 2…

python-excel自动化-openpyxl

openpyxl学习笔记 创建或打开表格存储和遍历数据设置单元格风格过滤器和排序更改工作表的背景颜色合并单元格冻结窗口数字格式公式图像图表条形图折线图散点图 创建或打开表格 # 创建 import datetime from openpyxl import Workbook # 实例化 wb Workbook() # 激活 work…

使用Excel生成sql脚本(insert/update/delete)

目录 前言 一、Excel文件脚本变量 二、操作示例 前言 在系统使用初期&#xff0c;存在某种原因&#xff0c;需要对数据库数据进行批量处理操作。往往都是通过制定Excel表格&#xff0c;通过Excel导入到数据库中&#xff0c;所以就弄一个excel生成sql的导入脚本&#xff0c;希…

vue3:组合式API和选项式API里分别如何使用store

vue3越来越主流了&#xff0c;但是很多人还不习惯vue3的组合式API写法&#xff0c;依旧喜欢用选项是API&#xff0c;但是很多功能的写法是不同的&#xff0c;比如我今天要分享的store写法。 我用的store是pinia。 选项式API&#xff08;script里不带setup&#xff09;的写法&…

3-Vuex状态管理

Vuex是一个专门为Vue.js应用程序开发的状态管理模式。它集中管理应用程序中的所有组件的状态&#xff0c;并提供了一种可预测的方式来修改和查询状态。 Vuex的核心概念包括&#xff1a; State&#xff08;状态&#xff09;&#xff1a;应用程序的状态存储在一个单一的对象中&a…

探索设计模式的魅力:AI赋能分层模式,解构未来,智领风潮

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;AI赋能分层模式&#xff0c;解构未来&#xff0c;智领风潮 ✨欢迎…

【网络安全】安全事件管理处置 — 安全事件处置思路指导

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、处理DDOS事件 1.准备工作 2.预防工作 3.检测与分析 4.限制、消除 5.证据收集 二、处理恶意代码事件 1.准备 2.预防 3.检测与分析 4.限制 5.证据收集 6.消除与恢复 …

【Leetcode】vector刷题

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;Leetcode刷题 目录 1.只出现一次的数字2.杨辉三角3.删除有序数组中的重复项4.只出现一次的数字II5.只出现一次的数字III6.电话号码的字母组合 1.只出现一次的数字 题目链接&#xff1a;136.只出现一…

算法训练营day24

参考链接代码随想录 (programmercarl.com) 一、回溯算法基础 1.什么是回溯法&#xff1f; 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 2. 回溯法的效率 因为回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;如果想让…

linux 编译opencv遇到问题

linux编译opencv4.8的时候遇到问题 Error: suffix or operands invalid for vpand看到很多说法是升级as这个工具的版本&#xff0c;自测是从2.20升级到2.27就可以了

【Flutter】webview_flutter使用详解

文章目录 前言一、如何使用 前言 webview_flutter是Flutter官方推出的一款用于Flutter上的webview插件&#xff0c;该插件在 iOS 用的是WKWebView 支持&#xff1b; 在 Android 上用的是系统WebView。 插件地址&#xff1a;https://pub.dev/packages/webview_flutter 一、如何…

python提取date的月份和天数

在Python编程中&#xff0c;经常需要从日期中提取月份和天数。这在数据处理、分析和可视化等领域都是非常常见的操作。 本文将介绍如何使用Python提取日期中的月份和天数&#xff0c;并通过代码示例展示具体的实现方法。 1.使用datetime模块获取日期信息 要提取日期的月份和天…

TypeScript 项目报错Projects must list all files or use an include pattern

文章目录 原因分析解决方案使用include和exclude使用files 总结 这条错误信息&#xff1a;“Projects must list all files or use an include pattern”通常与TypeScript项目的配置有关&#xff0c;特别是在处理 tsconfig.json文件时。这个错误提示你需要在 tsconfig.json中…