vector和数组的储存方式和使用

std::vector<int>vec{1,2,3,4,5};

常规数组:元素储存在栈区

int arr[10]={0};//元素0和变量arr均储存在栈区

动态数组:元素储存在堆区

//变量arr储存在栈区
int *arr=new int[10]();//arr10个元素均为0,元素在堆区
delete []arr;

std::vector:元素一般储存在堆区

std::vector<int>vec{1,2,3,4,5};

vec作为局部变量的话存放在栈区中,作为静态变量和全局变量的话则是存放在静态区中。vec的元素{1,2,3,4,5} 储存位置则要看具体实现,一般是在堆中 ,但根据Allocator(vector调用Allocator)的实现也有可能是在其他地方,比如栈或者静态区。

使用原则:

(1)对于小规模数据,三者均可以使用

(2)对于大规模数据,使用动态数组或者vector

(3)无论数据大小,优先使用vector(毕竟vector就是一个动态数组),vector元素一般在堆上,不用顾及数据量的大小,而且速度更快更安全。

加速vector的方法:

如果直接利用

vec.push_back()或者vec.insert()以及vec.emplack_back()

会导致过多的拷贝行为。需要实现分配内存,避免过多的动态申请和拷贝(和vector实现机制有关)。

若已知元素的数量n,则有两种方式:

vec.rezize(n,1)//会分配(reallocation)或者删除(destroy)内存,同时增加或减小vec的size
//利用下标去赋值
vec[i]=xx;
或者事先分配内存,再插入(避免多次分配内存和拷贝)
vec.reserve(n);//reserve分配的capacity大于等于n,reserve不会改变vec的size
vec.push_back();

若大致已知元素的数量n:

事先分配内存,再插入(避免多次分配内存和拷贝)
vec.reserve(n);//reserve分配的capacity大于等于n,reserve不会改变vec的size
vec.push_back();

在这里插入图片描述

在这里插入图片描述

参考链接
reserve
resize
zhihu
a
b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值