【STL面试】简述 vector 的实现原理

vector底层实现原理为一维数组(元素在空间连续存放)。

  1. 新增元素
    Vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大
    的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素。插入新的数据分在最后插
    入push_back和通过迭代器在任何位置插入,这里说一下通过迭代器插入,通过迭代器与第一个元
    素的距离知道要插入的位置,即int index=iter-begin()。这个元素后面的所有元素都向后移动一个
    位置,在空出来的位置上存入新增的元素。
cpp 复制代码
//新增元素
void insert(const_iterator iter,const T& t )
{ 
int index=iter-begin();
if (index<size_)
{
if (size_==capacity_)
{
int capa=calculateCapacity();
newCapacity(capa);
}
memmove(buf+index+1,buf+index,(size_-index)*sizeof(T));
buf[index]=t;
size_++;
}
}
  1. 删除元素
    删除和新增差不多,也分两种,删除最后一个元素pop_back和通过迭代器删除任意一个元素
    erase(iter)。通过迭代器删除还是先找到要删除元素的位置,即int index=iter-begin();这个位置后
    面的每个元素都想前移动一个元素的位置。同时我们知道erase不释放内存只初始化成默认值。
    删除全部元素clear:只是循环调用了erase,所以删除全部元素的时候,不释放内存。内存是在
    析构函数中释放的。
cpp 复制代码
//删除元素
iterator erase(const_iterator iter)
{
  int index=iter-begin();
  if (index<size_ && size_>0)
 {
    memmove(buf+index ,buf+index+1,(size_-index)*sizeof(T));
    buf[--size_]=T();
 }
  return iterator(iter);
}

迭代器iteraotr

迭代器iteraotr是STL的一个重要组成部分,通过iterator可以很方便的存储集合中的元素.STL为每个

集合都写了一个迭代器, 迭代器其实是对一个指针的包装,实现一些常用的方法,如++,--,!=,==,*,->等,

通过这些方法可以找到当前元素或是别的元素. vector是STL集合中比较特殊的一个,因为vector中

的每个元素都是连续的,所以在自己实现vector的时候可以用指针代替。

cpp 复制代码
//迭代器的实现
template<class _Category,class _Ty,class _Diff = ptrdiff_t,class _Pointer =
_Ty *,class _Reference = _Ty&>
struct iterator
{  
  // base type for all iterator classes
  typedef _Category iterator_category;
  typedef _Ty value_type;
  typedef _Diff difference_type;
  typedef _Diff distance_type;   // retained
  typedef _Pointer pointer;
  typedef _Reference reference;
};
相关推荐
居然是阿宋几秒前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
ChoSeitaku10 分钟前
17.QT-Qt窗口-工具栏|状态栏|浮动窗口|设置停靠位置|设置浮动属性|设置移动属性|拉伸系数|添加控件(C++)
c++·qt·命令模式
丘山子12 分钟前
如何在 1000 亿级数据规模下实现高效的去重统计?
后端·面试·架构
天天扭码30 分钟前
深入解析 JavaScript 中的每一类函数:从语法到对比,全面掌握适用场景
前端·javascript·面试
Cao12345678932135 分钟前
简易学生成绩管理系统(C语言)
c语言·开发语言
The Future is mine36 分钟前
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
开发语言·c#
亿坊电商39 分钟前
PHP框架在微服务迁移中能发挥什么作用?
开发语言·微服务·php
烁34739 分钟前
每日一题(小白)模拟娱乐篇33
java·开发语言·算法
uhakadotcom1 小时前
Lovable:用AI轻松打造完整应用,零基础也能快速开发
后端·面试·架构
坐吃山猪1 小时前
Python-Agent调用多个Server-FastAPI版本
开发语言·python·fastapi