admin管理员组

文章数量:1611954

STL中的vector,list,queue等,甚至string都支持长度或size的动态增加,这在存储事先size不知道的,或者size动态变化的多对象组合(类似于数组)来说是很方便的。事实上,为了支持size的动态变化,STL中的vector,list以及string会申请比size大的空间,即capacity,用于之后添加新的元素。这样做就可以在添加新元素时,直接存放在之前已经预先申请的空间上,免去了从新申请一块内存,再copy到新内存的开销。

vector,list,queue,以及string都有size和capacity的成员函数,根据我的一些测试,发现有一下规律(可能这些规律与具体的STL实现有关系):

1、在初始化的时候,一般size和capacity是相等的,也就是说allocator没有额外申请内存。

如string s("hello world!"); s.size()和s.capacity()都等于12。

2、在由于某种运算(append,insert,+)使得size变大时,会出现一下几种情况:

(1)capacity能够存下新增的元素,size将变大,capacity将不变;

(2)2倍capacity能够存下原来和新增的元素,它就会申请2*capacity的空间,copy原来和新增的元素,size变大,capacity变为原来两倍。

如s += “string”;那么s.size()变为18,而s.capacity()变为24。

(3)2倍capacity存不下原来和新增的元素,OK,申请原来size+新增size的空间,此时size和capacity相等。

如s += ”hello world!hello world!“;那么s.size()和s.capasity()都等于36。

本文标签: stlCapacitysize