size()指 目前存在的元素数。            元素个数
capacity()指 容器能存储 数据的个数      容器 容量
reserve()指定 容器 能存储数据的个数
resize()  重新 指定 有效元素的个数 ,区别与reserve()指定 容量的大小
当创建空容器时, 容量(capacity)为 0;当用完时,增加原容量的 1/2 (各编译器 可能存在差异  vs2010是这样的,mingw则 增加原容量 )--适用如 vector这种 元素连续存储的容器, 如为list则不同。
capacity 一般大于size的原因是为了避免 每次增加数据时都要重新分配内存,所以一般会 生成一个较大的空间,以便随后的数据插入。
 1#include <iostream>
 2#include <vector>
 3using namespace std;
 4 
 5int main()
 6{
 7    vector<int> ivec;
 8    cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
 9//添加10个元素
10    for(int i = 0; i < 10++i)
11    {
12        ivec.push_back(i);
13        cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
14    }

15//将容量用完
16    while(ivec.size() != ivec.capacity())
17        ivec.push_back(0);
18    //添加1个元素
19    cout<<"size = capacity. insert one element\n";
20    ivec.push_back(0);
21    cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
22 
23    ivec.reserve(100);
24    cout<<"reserve capacity 100\n";
25    cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
26 
27    //将容量用完
28    while(ivec.size() != ivec.capacity())
29        ivec.push_back(42);
30        //添加1个元素
31    cout<<"size = capacity. insert one element\n";
32    ivec.push_back(0);
33    cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
34 
35    system("pause");
36    return 0;
37}

38

 
2. capacity - 容器的成员函数capacity()取得

max_size - 容器的成员函数max_size()取得

STL容器的capacity属性,表示STL在发生realloc前能允许的最大元素数,也可以理解为预分配的内存空间。例如一个vector<int> v的capacity为5,当插入第6个元素时,vector会realloc,vector内部数据会复制到另外一个内存区域。这样之前指向vector中的元素的指针、迭代器等等均会失效。

max_size属性和capacity不同,表示STL容器允许的最大元素数,通常,这个数是一个很大的常整数,可以理解为无穷大。这个数目与平台和实现相关,在我的机器上vector<int>的max_size为1073741823,而string的max_size为4294967294。因为max_size很大~所以基本不会发生元素数超过max_size的情况,只需知道两者区别即可。

设定capacity

List, Map/Multimap, Set/Multiset, Deque

并不是所有的容器都会发生realloc,List,Map/Multimap,Set/Multiset的元素在内存中散布,不预分配内存,所以不会产生realloc的情况,对于这些容器,其capacity是无意义的,所以这些容器没有capacity()成员函数,也没有capacity属性。

deque双向队列情况比较特殊,deque将内存分块,每次分配固定大小的分块,一个分块填充满后开辟新的分块,也属于散布-连续混杂的情况,虽然deque会预分配内存空间,但也不会产生realloc(人家是alloc),所以也不具有capacity属性。

Vector, String, basic_string<wchar_t>

实际具有capacity属性的容器只有vector和string,在不同实现下,capacity也不尽相同。在我的机器上,情况如下:

vector<T>

默认构造函数 - capacity = 0

使用构造函数vector<T>(n, value=T())指定capacity - capacity = n

string  (basic_string<char> )

默认构造函数 - capacity = 15

没有指定capacity的构造式

指定了初始字符串的 - capacity = 大于字符串长度且等于n*15-1

 basic_string<wchar_t>

默认构造函数 - capacity = 7

指定了初始字符串的 - capacity = 大于字符串长度且等于n*8-1

 

除了通过构造式设定capacity,也可以使用reserve(n)来设定容器对象的capacity,避免之后的realloc。不过这一过程是只增不减的,如果n小于当前capacity,则reserve(n)无效。

 

收缩容器的内存占用空间

Vector, String, basic_string<wchar_t>

对于vector和string,因为reserve()的效果是只增不减,所以无法通过reserve()来收缩空间。如需收缩内存空间,思路如下:

新建一个vector/string

为新建的vector/string填充原容器的内容

将原容器的变量名指向新的容器

实际使用中只需要一条语句即可。

    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