程序笔记   发布时间:2022-07-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了STL----vector注意事项大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

开vector时要注意内存容易炸

最好的办法就是在开vector之后,对他进行一步操作

vector<int> a;
a.resize(n);

n就是你要开的数组的大小,此时数组里已经插入了n个零,占内存空间也只有n个int

还有另外一种方法

vector<int> a;
a.reserve(n);

这个就是关于内存的事了,此时我们已经将这个动态数组的大小固定了,就是说,它已经变成了一个普通的数组,只不过可以开的大一些

但是,这个时候vector内的下标是不可以直接调用的,因为这里只是控制了空间大小,而每一个下标内是没有值的

这里有两种办法,一个就是上面的resize()还有就是暴力插0

vector<int> a;
for(int i=1;i<n;i++)
    a.push_BACk(0);

不过这样写应该比第一种要慢一些

第一种的时间及内存

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
ll n;
vector<int> a;
int b[100000000];
signed main(){
    n=5e8;
    cout<<n/1024/1024<<endl;
    a.reserve(n+10);
    a.resize(n);
    //for(re i=1;i<=n;i++)a.push_BACk(0);
    cout<<a.max_size()<<endl<<a.capacity()<<endl;
}



476
1073741823
500000010

real    0m1.079s
user    0m0.916s
sys    0m0.160s

第二种的时间及内存

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
ll n;
vector<int> a;
int b[100000000];
signed main(){
    n=5e8;
    cout<<n/1024/1024<<endl;
    a.reserve(n+10);
    //a.resize(n);
    for(re i=1;i<=n;i++)a.push_BACk(0);
    cout<<a.max_size()<<endl<<a.capacity()<<endl;
}



476
1073741823
500000010

real    0m6.116s
user    0m6.000s
sys    0m0.116s

可以清晰的看到下面那个炸了

 

为什么要说这些呢

因为,vector在内部开空间的时候,是在2的指数级上开的空间

就是如果空间不够了,他会直接把你用的空间*2

然后直接炸掉你的空间,然后导致你暴零

所以我们在利用vector做题时,最好限制一下它的空间,可以让内存保持在一个可控的范围内

还有时间问题,注意resize比直接插入快。。。。

 

我也不知道为什么我的电脑之让我把数组开到5e8

而别人的电脑都可以开到2305843009213693951

害noi_linux欺负人

大佬总结

以上是大佬教程为你收集整理的STL----vector注意事项全部内容,希望文章能够帮你解决STL----vector注意事项所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。