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

vector模拟实现与核心机制

Vector 是 C++ STL 中的动态数组,核心是连续内存存储 + 动态扩容,以下是极简模拟实现,覆盖核心功能:
cpp
 
运行
#include <iostream>
#include <cstring>
using namespace std;template <typename T>
class MyVector {
private:T* _data;       // 存储数据的连续内存指针size_t _size;   // 当前元素个数size_t _capacity; // 已分配内存容量(可容纳的最大元素数)// 扩容核心:重新分配更大内存,拷贝旧数据,释放旧内存void expand() {// 初始容量为0时设为4,否则扩容至2倍size_t newCap = _capacity == 0 ? 4 : _capacity * 2;T* newData = new T[newCap];// 拷贝旧数据(浅拷贝,仅演示核心逻辑)for (size_t i = 0; i < _size; ++i) {newData[i] = _data[i];}delete[] _data; // 释放旧内存_data = newData;_capacity = newCap;}public:// 构造函数:初始化空容器MyVector() : _data(nullptr), _size(0), _capacity(0) {}// 析构函数:释放内存~MyVector() {delete[] _data;}// 尾部添加元素void push_back(const T& val) {// 容量不足时扩容if (_size >= _capacity) {expand();}_data[_size++] = val;}// 删除尾部元素void pop_back() {if (_size > 0) {--_size; // 仅修改size,无需立即释放内存(惰性释放)}}// 获取当前元素个数size_t size() const { return _size; }// 获取当前容量size_t capacity() const { return _capacity; }// 重载[]运算符,支持随机访问T& operator[](size_t idx) {if (idx >= _size) {throw out_of_range("Index out of range");}return _data[idx];}
};// 测试示例
int main() {MyVector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);cout << "Size: " << vec.size() << ", Cap: " << vec.capacity() << endl; // Size:3, Cap:4vec.push_back(4);vec.push_back(5);cout << "Size: " << vec.size() << ", Cap: " << vec.capacity() << endl; // Size:5, Cap:8cout << vec[2] << endl; // 输出3return 0;
}
 

二、Vector 核心机制(底层原理拆解)

核心机制 原理说明 设计目的
连续内存存储 底层基于数组实现,元素在内存中连续排布,通过指针直接偏移实现随机访问(O (1)) 保证快速访问、遍历效率
容量与大小分离 size 是当前实际元素数,capacity 是已分配内存可容纳的最大元素数 减少频繁内存分配,提升性能
动态扩容 当 size >= capacity 时,分配新内存(通常扩容 2 倍),拷贝旧数据,释放旧内存 实现 “动态” 特性,避免内存浪费
惰性释放 pop_back 仅减少 size,不立即释放内存;clear 仅置 size=0,保留容量 避免频繁释放 / 重新分配内存
随机访问 重载 [] 运算符,通过 _data + idx 直接定位元素(数组偏移原理) 支持快速索引,媲美原生数组

三、关键特性补充

  1. 扩容代价:扩容会触发内存重新分配 + 数据拷贝,是耗时操作(O (n)),因此实际开发中可通过 reserve(n) 提前指定容量,避免频繁扩容;
  2. 内存管理:析构函数必须释放 _data 指向的连续内存,否则会造成内存泄漏;
  3. 浅拷贝问题:上述示例为简化用了浅拷贝,实际工业级实现需重载拷贝构造 / 赋值运算符,实现深拷贝(避免多个对象共享同一块内存);
  4. 迭代器失效:扩容后原迭代器(本质是指针)会指向已释放的旧内存,导致失效,这是 Vector 的核心坑点。
http://www.rkmt.cn/news/182883.html

相关文章:

  • Python安装后无法导入模块?Miniconda-Python3.10修复sys.path
  • 免费开源!Stable Diffusion AI 生图天花板,下载安装一款能免费部署的 AI 绘图神器
  • HTML前端展示:将训练结果嵌入网页中的Jupyter输出
  • 2025年东莞线对板连接器厂家口碑洞察报告:从技术到服务的专业选型指南 - 品致汇
  • 使用SSH连接远程Miniconda容器进行长时间模型推理任务
  • 《程序员修炼之道:从小工到专家》观后感第八篇
  • Mac M1芯片适配:Miniconda安装PyTorch ARM64版本指南
  • HTML音频播放功能:Miniconda-Python3.10处理语音大模型输出
  • 数据人狂喜!这款Oracle导出工具,效率直接拉满!
  • 零门槛大模型知识库搭建指南:5分钟用Dify实现RAG应用,小白必学,建议收藏!
  • 清华镜像HTTPS配置:Miniconda-Python3.10避免证书验证错误
  • 经营帮集中采购:中小企业采购降本的实用选择
  • 项目管理中最大的浪费是什么?
  • 《程序员修炼之道:从小工到专家》观后感第七篇
  • CUDA安装后无法识别?教你正确配置Miniconda中的PyTorch环境
  • Conda create环境超时?Miniconda-Python3.10指定国内源解决
  • 清华大学开源镜像站加速Miniconda组件下载速度
  • 无代码还是Vibe Coding? 场景三
  • Markdown TOC自动生成:Miniconda-Python3.10配合tocmd工具使用
  • 2025国内最新护肤品代加工企业top6榜单公布!广东、广州等地区行业优质公司专业解析及选择指南,资质产能双优助力品牌高效发展 - 全局中转站
  • 一键清除指定端口的 Windows 批处理脚本使用指南
  • 无代码还是Vibe Coding? 场景四
  • 锂电池均衡之主动均衡Simulink仿真探索
  • springboot鞍山钢峰风机人力资源管理系统设计实现
  • 当两个单词可能是同一个:聊聊《最短单词距离 III》背后的“算法洁癖”
  • 从领跑到跨越:BOE(京东方)提前点亮中国首条第8.6代AMOLED生产线,开创全球中尺寸OLED高端化全新里程碑
  • Pyenv install python3.10失败?切换Miniconda-Python3.10绕过编译难题
  • Equal Sums
  • 基于NodeJs爱宠之家设计与实现-核心功能模块设计
  • ProfiNet转DeviceNet协议转换网关助力多泵协同,年省电费3万元