当前位置: 首页 > 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.jsqmd.com/news/167256/

相关文章:

  • yolov5识别demo
  • 在Miniconda中安装FastAPI构建RESTful接口
  • python基于校园学生行为大数据的精准分析管理系统
  • Python安装后无法导入模块?Miniconda-Python3.10修复sys.path
  • springboot的马术俱乐部管理系统设计与实现
  • conda list与pip list输出差异原因分析
  • Java学习!
  • C/C++复杂类型声明解读:从优先级看螺旋法则 - 24
  • 经营帮集中采购:中小企业采购降本的实用选择
  • 哈基米噢南北绿豆-beta冲刺
  • 必知!哪家实验室净化超靠谱
  • Docker restart policy设置:Miniconda-Python3.10容器自动恢复
  • 102302112王光诚综合实践
  • 《程序员修炼之道:从小工到专家》观后感第八篇
  • Markdown TOC自动生成:Miniconda-Python3.10配合tocmd工具使用
  • Miniconda初始化失败?详解conda init命令执行逻辑
  • AWMS 目录
  • AWMS 目录
  • Windows本地微调大模型全攻略:从零打造你的专属猫娘AI助手
  • PyTorch模型量化压缩:Miniconda-Python3.10降低推理成本
  • SAP Clean Core下如何实现采购订单相关的增强?
  • 从零开始搭建深度学习环境:Miniconda + PyTorch + GPU实战
  • 数据人狂喜!这款Oracle导出工具,效率直接拉满!
  • 安装包依赖树查看:Miniconda-Python3.10使用pipdeptree分析
  • 安装包依赖树查看:Miniconda-Python3.10使用pipdeptree分析
  • 《程序员修炼之道:从小工到专家》观后感第九篇
  • 使用pip和conda双工具在Miniconda环境中安装PyTorch GPU版本
  • Docker stats监控资源:Miniconda-Python3.10实时观察GPU占用
  • 《程序员修炼之道:从小工到专家》观后感第七篇
  • 项目管理中最大的浪费是什么?