您的位置:首页 > 其它

STL之vector分配内存问题

2017-04-25 20:00 190 查看
vector是STL(标准模板库)中的容器,也是最常用的。一些算法都是基于vector容器。

vector是STL容器类中最简单的一个,这里主要介绍vector的内存分配。

vector容量增长是按照现在容量的一倍进行增加的,也就是,比如当前vector的size为6,容量也为6,那么再次向vector中放入数据时,vector重新申请内存空间,这个时候vector的容量为12,而不是我们以为的容量是7。如果没有超过现有vector的容量,容量不会继续增加。

vector的内存分配:

vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后面继续增加。后面的内存有可能分配个其他的变量或程序数据等。vector容器增长的策略是,重新申请一块更大的内存,并把现有容器中的元素逐个复制过去,然后释放旧有的内存空间。如果原先有个迭代器指向vector内部,重新申请内存后,该迭代器就失效了,不能继续使用。

为什么采用这样的策略?因为每次申请内存是需要时间的,如果每次只申请一个单位的内存,则每加入一个元素,都要进行内存的申请,并且要将原来的数据复制到新的内存空间。按照一倍的策略,则会避免这个问题,减少了申请内存的次数,降低了时间开销。

下面是一些实验:

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;

int main()
{
vector<int>a;
cout << "初始化的容量大小 =  " << a.capacity()<<endl;
a.push_back(1);
cout << "元素数目 = " << a.size() << endl;
cout << "增加一个元素后容量的大小 = " << a.capacity() << endl;
a.push_back(1);
cout << "元素数目 = " << a.size() << endl;
cout << "增加一个元素后容量的大小 = " << a.capacity() << endl;
a.push_back(1);
cout << "元素数目 = " << a.size() << endl;
cout << "增加一个元素后容量的大小 = " << a.capacity() << endl;
return 0;
}


实验结果:



从实验结果可以看出刚开始容量大小为0,增加一个元素后,容量变成1,再次增加一个元素时,容量变成2,再增加一个元素时,容量这个时候就变成了4。说明是成倍增加的。

下面是内存的查看:

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;

int main()
{
vector<int>a;
a.push_back(1);
cout << "增加一个元素的内存地址 = " << &a[0] << endl;
a.push_back(2);
cout << "增加一个元素的内存地址 = " << &a[0] << endl;
return 0;
}


实验结果:



每次引用a[0]的地址,可以看到两次打印的结果是不同的,说明vector重新申请了一块更大的新的内存,并且将原来里面的值复制到新的内存空间。

这里讨论下要不要使用STL的问题,对于初学者,自己还是要实现一遍这些容器,不必全部实现,基本的需要实现,这样加深自己的理解,不仅要知其然,还要知其所以然。起码知道自己用的是什么,比如从网上下载了一个不知名的软件,怎么知道不会有后门呢,最好找到源码,自己编译,然后使用。这样才放心。

像STL中的队列,栈,链表等,实现的已经很完美了,当学会这些原理,并且能够自己实现的时候,就可以使用这些容器了,不必每次都自己实现,毕竟重复的工作最没意思。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: