开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欺负人