STL容器——vector

vector: 是一种序列式容器,和数组类似,但它比数组更优越,是一种动态单向数组。

一:vector特点:

1.动态分配空间,当空间不足时,会执行分配新空间——复制元素——释放原空间;

2.在末端插入和删除执行效率高,在其他位置插入和删除效率低(为保持原有相对次序,插入和删除点之后的元素需要整体后移);

3.删除数据并不会释放已分配的空间,因此vector的capacity(容量)大于vector的size(元素个数);

4.支持随机访问,且执行效率高;

5.vector是线程安全的,所有操作加了同步锁,不支持多线程操作。

二:vector定义与初始化

vector<int> v;//定义int型向量(capacity和size为0)

vector<int> v1(10);//拥有10个元素,元素默认为0(capacity和size为10)

vector<int> v2(10, 10);//拥有10个元素,元素默认为10(capacity和size为10)

vector<int> v3 = { 1, 2, 3, 4 }; //拥有4个元素(capacity和size为4)

vector<int> v4{ 1,2,3,4 };//同v3

vector<int> v5(v3); //定义新容器,拷贝v3所有元素

vector<int> v6 = v3;//同v5

vector<int> v7(v3.begin(), v3.end());//定义新容器,拷贝v3区间内元素

三:基本操作

v3.push_back(1);//向量末端插入数值1
v3.size();//向量元素个数
v3.at(0); //访问向量第一个元素,类似v[0]
v3.capacity();//向量分配空间大小
v3.back();//获取尾部数据
v3.front();//获取头部数据
v3.pop_back();//尾部删除,不会释放已分配空间(capacity)
v3.insert(v3.end(), 1);//末端插入1
v3.insert(v3.end(), 5, 1);//末端插入5个1
v3.insert(v3.end(), v4.begin(), v4.end());//
v3.erase(v3.begin() + 1);//删除指定位置值
v3.erase(v3.begin(), v3.begin() + 3);//删除区间值
v3.reserve(20);//vector的大小设置为20,元素值为随机值(不是默认值)
v3.resize(20);//vector的大小设置为20,元素值为默认值
v3.resize(20, 1);//vector的大小设置为20,新分配空间元素值为1
v3.assign(2, 3);//赋值函数,将2个3赋值给v3,会改变v3的size(size为2)
v3.emplace(v3.begin(), 1);//插入函数,begin之前插入1
v3.clear();//清除向量元素(size),不会释放已分配空间(capacity)
v3.empty();//容器判空(size为0返回true)
v3.shrink_to_fit();//时capacity与size大小一致

emplace / push_back / insert的区别

1.emplace直接在指定位置插入数据;而push_back和insert需要先生成具有复制内容的对象,然后将对象内容复制到容器中;

2.emplace和push_back只能插入一个数据,而insert可以插入多个数据;push_back只能在末端插入,insert可以在任意地方;

3.插入效率emplace>push_back>insert

四:迭代器

包括: begin、end、rbegin、rend、cbegin、cend、crbegin、crend

v3.begin(); 返回迭代器, 指向第一元素
v3.end(); 返回迭代器, 指向最末元素的下一个位置
v3.cbegin(); 返回迭代器, 指向第一元素, 类型为const
v3.cend(); 返回迭代器, 指向最末元素的下一个位置, 类型为const
v3.rbegin(); 返回反向迭代器, 指向反向迭代的第一元素
v3.rend(); 返回反向迭代器, 指向反向迭代的最末元素的下一个位置
v3.crbegin(); 返回反向迭代器, 指向反向迭代的第一元素, 类型为const
v3.crend(); 返回反向迭代器, 指向反向迭代的最末元素的下一个位置, 类型为const

begin和cbegin的区别
可以通过v.begin()修改容器内元素的值
不能通过v.cbegin()修改容器内元素的值

五:std::vector和std::array

std::vector是自动扩容的,而std::array是大小固定的。std::vector删除元素后,内存不会自动回收,需要手动运行shrink_to_fit释放这部分内存。当容器大小固定时,优先选择array。

六:总结

1.如果已知构造的vector的大小,且元素设置为特定值,则调用resize(),将vector所需的的内存大小直接开辟出来,否则会引发扩容时的重开空间、拷贝数据、释放原空间这一系列操作,降低了效率;

2.已知构造的vector的大小,对元素值没有特定要求,则调用reserve(),因为resize()会遍历整个vector,进行赋值,而reserve只开辟空间,不会遍历,效率更高;

3.erase 的返回值为所删除元素的下一个元素的迭代器,如果删除到尾,则会返回end(),所以,在每次调用erase函数之后应该用其返回值来更新迭代器,从而避免因迭代器失效而引起的错误;

4.扩容方式:开辟新空间——原数据插入到新空间——释放旧空间——指向新空间;

5.时间复杂度:访问时间复杂度时O(1);插入时间复杂度:push_back为O(1),insert为O(n);删除时间复杂度:pop_back为O(1),erase为O(n)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值