
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

2. capacity - 容器的成員函數(shù)capacity()取得
max_size - 容器的成員函數(shù)max_size()取得
STL容器的capacity屬性,表示STL在發(fā)生realloc前能允許的最大元素?cái)?shù),也可以理解為預(yù)分配的內(nèi)存空間。例如一個(gè)vector<int> v的capacity為5,當(dāng)插入第6個(gè)元素時(shí),vector會(huì)realloc,vector內(nèi)部數(shù)據(jù)會(huì)復(fù)制到另外一個(gè)內(nèi)存區(qū)域。這樣之前指向vector中的元素的指針、迭代器等等均會(huì)失效。
max_size屬性和capacity不同,表示STL容器允許的最大元素?cái)?shù),通常,這個(gè)數(shù)是一個(gè)很大的常整數(shù),可以理解為無(wú)窮大。這個(gè)數(shù)目與平臺(tái)和實(shí)現(xiàn)相關(guān),在我的機(jī)器上vector<int>的max_size為1073741823,而string的max_size為4294967294。因?yàn)閙ax_size很大~所以基本不會(huì)發(fā)生元素?cái)?shù)超過(guò)max_size的情況,只需知道兩者區(qū)別即可。
設(shè)定capacity
List, Map/Multimap, Set/Multiset, Deque
并不是所有的容器都會(huì)發(fā)生realloc,List,Map/Multimap,Set/Multiset的元素在內(nèi)存中散布,不預(yù)分配內(nèi)存,所以不會(huì)產(chǎn)生realloc的情況,對(duì)于這些容器,其capacity是無(wú)意義的,所以這些容器沒(méi)有capacity()成員函數(shù),也沒(méi)有capacity屬性。
deque雙向隊(duì)列情況比較特殊,deque將內(nèi)存分塊,每次分配固定大小的分塊,一個(gè)分塊填充滿后開辟新的分塊,也屬于散布-連續(xù)混雜的情況,雖然deque會(huì)預(yù)分配內(nèi)存空間,但也不會(huì)產(chǎn)生realloc(人家是alloc),所以也不具有capacity屬性。
Vector, String, basic_string<wchar_t>
實(shí)際具有capacity屬性的容器只有vector和string,在不同實(shí)現(xiàn)下,capacity也不盡相同。在我的機(jī)器上,情況如下:
vector<T>
默認(rèn)構(gòu)造函數(shù) - capacity = 0
使用構(gòu)造函數(shù)vector<T>(n, value=T())指定capacity - capacity = n
string (basic_string<char> )
默認(rèn)構(gòu)造函數(shù) - capacity = 15
沒(méi)有指定capacity的構(gòu)造式
指定了初始字符串的 - capacity = 大于字符串長(zhǎng)度且等于n*15-1
basic_string<wchar_t>
默認(rèn)構(gòu)造函數(shù) - capacity = 7
指定了初始字符串的 - capacity = 大于字符串長(zhǎng)度且等于n*8-1
除了通過(guò)構(gòu)造式設(shè)定capacity,也可以使用reserve(n)來(lái)設(shè)定容器對(duì)象的capacity,避免之后的realloc。不過(guò)這一過(guò)程是只增不減的,如果n小于當(dāng)前capacity,則reserve(n)無(wú)效。
收縮容器的內(nèi)存占用空間
Vector, String, basic_string<wchar_t>
對(duì)于vector和string,因?yàn)閞eserve()的效果是只增不減,所以無(wú)法通過(guò)reserve()來(lái)收縮空間。如需收縮內(nèi)存空間,思路如下:
新建一個(gè)vector/string
為新建的vector/string填充原容器的內(nèi)容
將原容器的變量名指向新的容器
實(shí)際使用中只需要一條語(yǔ)句即可。
vector<int> v(10, 5); v.reserve(20); vector<int>(v).swap(v);
3.參考:http://www.cnblogs.com/SelaSelah/archive/2012/05/30/2526736.html
http://blog.csdn.net/youxin2012/article/details/9213539