C++ STL 完整入门笔记[3]:vector底层剖析 附杨辉三角实战
前言刷 LeetCode118 杨辉三角时发现很多同学只会调用vector接口完成题目却完全不懂vector底层内存模型、push_back扩容逻辑、二维vector存储结构。本文结合手写源码 杨辉三角实战彻底吃透vector底层原理。一、vector 基础用法与初始化1. 列表初始化initializer_list#include vector #include string using namespace std; // 1. 列表初始化底层依赖initializer_list vectorint v1({10, 20, 30}); vectorint v2{10, 20, 30, 1,1,1}; // 2. push_back插入临时对象 vectorstring str_v; str_v.push_back(张三); // 底层构造string临时对象拷贝/移动到vector内存底层逻辑vector接收initializer_list参数的构造函数会遍历列表循环调用push_back完成元素拷贝。2. vector 核心修改接口 Modifiers接口作用底层行为push_back(val)尾部插入元素容量充足直接构造容量不足触发扩容emplace_back(args)尾部原位构造直接在内存构造对象无临时对象效率更高insert指定位置插入后续元素全部后移时间复杂度 O (n)erase删除指定元素后续元素前移O (n)clear清空元素析构所有对象不释放底层内存pop_back删除尾部元素析构最后一个元素容量不变二、vector 底层内存模型手写简化源码1. vector 类核心成员templateclass T, class Alloc allocatorT class vector { public: typedef T value_type; typedef T* iterator; private: iterator _start; // 有效数据起始地址 iterator _finish; // 有效数据末尾下一位 iterator _end_of_storage; // 内存容量末尾 public: // 构造、析构、接口省略 iterator begin() { return _start; } iterator end() { return _finish; } // 有效元素个数 size_t size() const { return _finish - _start; } // 总容量 size_t capacity() const { return _end_of_storage - _start; } };内存图解[_start 元素1 元素2 元素3 _finish 空闲内存 _end_of_storage]size()_finish - _start当前存了多少元素capacity()_end_of_storage - _start整块内存能容纳多少元素2. push_back 扩容核心逻辑void push_back(const T x) { // 内存还有空闲直接在_finish处构造对象 if (_finish ! _end_of_storage) { construct(_finish, x); _finish; } else { // 空间不足触发扩容 insert_aux(end(), x); } }扩容流程insert_aux计算新容量原容量为 0 则扩为 1否则扩容为原来 2 倍分配一块更大的连续内存将旧内存中所有元素拷贝到新内存在新内存尾部插入待新增元素析构释放旧内存整块空间更新_start/_finish/_end_of_storage指向新内存3. emplace_back 与 push_back 区别push_back(const T val)先构造临时对象再拷贝 / 移动到 vector 内存存在临时对象开销emplace_back(参数1, 参数2...)直接在 vector 底层内存原位构造对象无临时对象性能更优4. 二维 vector 存储结构vectorvectorintvectorvectorint vv; vv.resize(numRows, vectorint());内存模型拆解外层vectorvectorint底层存一堆vectorint对象指针数组每个内层vectorint独立拥有自己的三块指针_start/_finish/_end_of_storage各自管理一维 int 数组vv[i][j]等价vv.operator[](i).operator[](j)先取第 i 个内层 vector再取它的第 j 个 int 元素三、实战LeetCode 118 杨辉三角题目要求给定非负整数numRows生成杨辉三角前numRows行每行首尾都是 1中间数字 上一行左上 右上数字。C vector 完整实现#include vector using namespace std; class Solution { public: vectorvectorint generate(int numRows) { vectorvectorint vv; // 1. 先开辟numRows行空间每行初始为空vector vv.resize(numRows, vectorint()); for (size_t i 0; i numRows; i) { // 第i行有 i1 个元素提前resize分配空间 vv[i].resize(i 1); // 每行首尾固定为1 vv[i][0] 1; vv[i][i] 1; } // 从第3行(i2)开始填充中间数值 for (size_t i 2; i vv.size(); i) { for (size_t j 1; j vv[i].size() - 1; j) { // 当前值 上一行j-1 上一行j vv[i][j] vv[i-1][j-1] vv[i-1][j]; } } return vv; } };代码思路解析外层 vector 开辟行vv.resize(numRows, vectorint())创建 numRows 个空一维 vector每行预分配列空间第i行共i1个元素vv[i].resize(i1)提前分配连续 int 内存避免多次扩容首尾赋值 1杨辉三角每行第一个、最后一个数字恒为 1递推填充中间值从第三行i2开始中间元素等于上一行相邻两数之和拓展C 语言动态二维数组实现对比 vector很多同学混淆 C 语言二级指针二维数组和 C 二维 vector附上 C 版本对比/** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned as *returnColumnSizes array. */ int** generate(int numRows, int* returnSize, int** returnColumnSizes) { // 外层指针数组存放每行int数组地址 int** aa (int**)malloc(sizeof(int*) * numRows); // 记录每行元素个数 *returnColumnSizes (int*)malloc(sizeof(int) * numRows); for (int i 0; i numRows; i) { int col i 1; aa[i] (int*)malloc(sizeof(int) * col); (*returnColumnSizes)[i] col; aa[i][0] 1; aa[i][i] 1; } for (int i 2; i numRows; i) { for (int j 1; j i; j) { aa[i][j] aa[i-1][j-1] aa[i-1][j]; } } *returnSize numRows; return aa; }C 与 C vector 核心区别C 二级指针二维数组每行 int 数组内存不连续仅外层指针连续手动 malloc 分配、free 释放容易内存泄漏Cvectorvectorint每个内层 vector 内部 int 连续vector 自动管理内存出作用域自动析构释放无需手动管理堆内存四、vector 核心知识点总结三指针模型_start/_finish/_end_of_storage区分 size 和 capacity底层是连续堆内存扩容机制空间不足默认 2 倍扩容旧内存数据拷贝后释放扩容存在性能开销大量数据建议提前reserve()预分配容量emplace_back 优于 push_back原位构造消除临时对象拷贝开销二维 vector 本质存储多个独立一维 vector 对象各行内存互不连续使用场景需要动态长度、随机访问的数组场景底层连续内存缓存友好随机访问 O (1)

相关新闻

Linux进程权限

Linux进程权限

本文是Linux系统下讨论。注意,Linux和Unix有很多不同的地方,并且各个不同的Unix系统也有很多不同。 本文讨论对象: ruid: real user id,即实际用户,也即当前登录的用户euid: effective user id, 即有效用…

2026/7/23 1:20:49 阅读更多 →
HarmonyOS ArkTS 实战:实现一个校园证件照拍摄与预约应用

HarmonyOS ArkTS 实战:实现一个校园证件照拍摄与预约应用

HarmonyOS ArkTS 实战:实现一个校园证件照拍摄与预约应用 项目效果 本文使用 HarmonyOS 和 ArkTS 实现一个校园证件照拍摄与预约应用。 应用可以预约证件照拍摄,选择证件照尺寸,在线选片,查看拍摄样片,并提供拍摄预约、照片下载、打印配送等功能。 项目使用 DevEco Studio…

2026/7/23 1:20:49 阅读更多 →
Tiva™ C系列外设管理:PP与SR寄存器实战指南

Tiva™ C系列外设管理:PP与SR寄存器实战指南

1. 从寄存器手册到实战:Tiva™ C系列外设管理的核心逻辑如果你和我一样,长期泡在嵌入式开发的一线,特别是基于ARM Cortex-M内核的MCU,那你肯定对“外设管理”这四个字深有感触。它远不止是初始化几个时钟、配置几个引脚那么简单。…

2026/7/23 1:20:49 阅读更多 →

最新新闻

Tiva™ TM4C1299NCZAD GPTM定时器中断清除与配置全解析

Tiva™ TM4C1299NCZAD GPTM定时器中断清除与配置全解析

1. GPTM中断清除机制深度解析与实战应用在嵌入式实时系统中,定时器中断的及时、准确处理是保证系统稳定性和响应性的基石。Tiva™ C系列微控制器的通用定时器模块功能强大,但其中断状态管理机制,尤其是清除操作,却暗藏玄机。很多开…

2026/7/23 2:03:04 阅读更多 →
TM4C1294看门狗定时器:双模块设计、寄存器配置与嵌入式系统抗干扰实战

TM4C1294看门狗定时器:双模块设计、寄存器配置与嵌入式系统抗干扰实战

1. 看门狗定时器:嵌入式系统的“安全卫士”在嵌入式系统开发中,尤其是工业控制、汽车电子或长时间无人值守运行的物联网设备,最怕的就是软件“跑飞”或陷入死循环。想象一下,一个控制工厂机械臂的微控制器因为某个未知的软件缺陷突…

2026/7/23 2:03:04 阅读更多 →
智能助理核心技术:任务理解与多模态交互架构解析

智能助理核心技术:任务理解与多模态交互架构解析

1. 智能助理的任务理解技术架构智能助理的核心能力在于对用户指令的准确理解和意图识别。现代智能助理系统通常采用三层架构实现任务理解:语音识别层:将语音输入转换为文本。当前主流采用端到端的深度学习模型,如Transformer架构的Conformer模…

2026/7/23 2:03:04 阅读更多 →
嵌入式GUI键盘与按钮控件:从事件驱动到实战优化

嵌入式GUI键盘与按钮控件:从事件驱动到实战优化

1. 项目概述在嵌入式系统开发中,图形用户界面(GUI)是与用户交互的桥梁,而键盘和按钮控件则是这座桥梁上最关键的“按钮”和“键盘”。无论是工业HMI触摸屏上的参数输入,还是智能家居面板上的功能选择,都离不…

2026/7/23 2:03:04 阅读更多 →
论文降重技术解析:从语义重构到风格模拟

论文降重技术解析:从语义重构到风格模拟

1. 论文降重的核心痛点与行业现状学术论文写作中最让研究者头疼的问题之一,就是如何有效降低重复率。近年来,随着知网、维普等主流查重系统陆续升级AIGC检测功能,传统的"同义词替换语序调整"式降重方法已经逐渐失效。我最近实测发现…

2026/7/23 2:03:04 阅读更多 →
那些进了大厂的打工人快乐吗

那些进了大厂的打工人快乐吗

那些进了大厂的打工人快乐吗?

2026/7/23 2:02:03 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻