数组 vector
2023-2-16
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。
 

vector的扩充机制

按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。
迭代器_First指向使用空间的头部,_Last指向使用空间大小(size)的尾部,_End指向使用空间容量(capacity)的尾部
notion image
不同的的编译器实现扩容方式不同,vs编译器每次是以1.5倍且向下取整的策略进行扩容,gcc编译器则是每次以2.0倍的策略进行扩容。扩容的大小叫做扩容因子:
  • 扩容因子大,每次需要分配的新内存空间越多,分配空间耗时。空闲空间较多,内存利用率低。
  • 扩容因子小,需要再分配的可能性更高,扩容耗时。空闲空间较少,内存利用率较。
 

vector的构造

  • vector():创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&):复制构造函数
  • vector(begin,end):复制[begin,end)区间内元素到vector
 

vector迭代器使用

  • iterator :正向迭代器
  • reverse_iterator:反向迭代器
  • const_iterator:常量迭代器
  • const_reverse_iterator:常量反向迭代器
  • begin()返回指向容器中第一个元素的迭代器
    • end()返回指向容器最后一个元素所在位置后一个位置的迭代器
  • cbegin():在begin()基础上,增加了const属性,不能用于修改元素
    • cend():在end()基础上,增加const属性,不能用于修改元素
  • rbegin():反向,返回指向最后一个元素的迭代器
    • rend() :反向,返回指向第一个元素所在位置前一个位置的迭代器
  • crbegin() :在rbegin()基础上,增加了const属性,不能用于修改元素
    • crend() :在rend()基础上,增加了const属性,不能用于修改元素
 

vector容量操作

函数成员
函数功能
size()
返回实际元素个数
max_size()
返回元素个数的最大值。这通常是一个很大的值,很少会用到
resize()
改变实际元素的个数
capacity()
返回当前容量
empty()
判断容器中是否有元素,若无元素,则返回 true
reserve()
增加容器的容量
shrink _to_fit()
将内存减少到等于当前元素实际所使用的大小
 
 

vector增删查改

函数成员
函数功能
operator[ ]
重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素
at()
使用经过边界检查的索引访问元素
front()
返回第一个元素的引用。
back()
返回最后一个元素的引用。
data()
返回指向容器中第一个元素的指针。
assign()
用新元素替换原有内容。
push_back()
尾插
pop_back()
尾删
insert()
在指定的位置插入一个或多个元素。
erase()
移出一个元素或一段元素。
clear()
移出所有的元素,容器大小变为 0。
swap()
交换两个容器的所有元素。
emplace()
在指定的位置直接生成一个元素。
emplace_back()
在序列尾部生成一个元素。
 

迭代器失效

在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删除时,当前迭代器需要重新赋值,否则会失效
 

vector实现

 
 
 
  • 计算机基础
  • 数据结构与算法
  • 算法复杂度 vector题目
    目录