[C++]vector的存储方式和自增长问题

来源:互联网 发布:琼瑶毁三观台词 知乎 编辑:程序博客网 时间:2024/06/06 10:53

我们知道,顺序容器vector为了支持快速的随机访问,使用了连续的方式存放每一个元素

因为元素的连续存储的,如果要在vector中插入一个元素,假设容器已没有空间存放新的元素,那就必须要另外找一块连续的空间,将旧元素copy到新空间中,并且把新元素插入到新空间的末尾

实际上,为了使vector实现快速的内存分配,实际分配的空间会比当前需要的空间多一些,vector预留了额外的存储区,用于存放新的元素


比如当前vector的size为30,实际分配的空间往往会大于30,

vector<int> v;for (int i=0; i!=30; ++i){v.push_back(i);
}
cout<<"size="<<v.size()<<endl;cout<<"capacity="<<v.capacity()<<endl;



如果再往此vector中插入元素,则一开始会使用预先分配到内存,也就是不需要重新分配,这样的本质是一次分配一块较大的空间,可以节省分配和复制元素的消耗,往往性能也比较高


正因为实现vector的时候,对此做了优化,所以我们往往更喜欢使用vector而不是list,当然,这也需要看使用的场景,list更适合在需要随机插入和删除元素的场景,如果不需要,往往使用vector更合适


同时,vector的这种存储机制也可能会出现问题,当机器内存没有办法分配vector需要的较大的连续的存储空间时,就会导致分配失败,并且抛出一个异常,而list却不一定


假设,内存还有100,连续的空间有10,30,50,10,如果使用vector,需要连续的空间80,则会分配失败,而使用list,则不会有这个问题,list并不要求使用连续的空间

当然,如果vector和list需要空间120,则用哪一种方式都会导致分配失败


这里写这么多,只是想说明并不一定vector就更适合顺序访问,list更适合随机删除/插入,有时候还需要考虑机器的内存和实际的使用场景,只有了解好了容器本身的实现机制,才能更好的使用它们

	
				
		
原创粉丝点击