STL之vector详解

一、vector容器的自增长

  首先,我们知道vector容器是由数组做出来的;它具备了数组的优缺点.

数组的优点:

  操作数据,读取速度很快,因为有下标;

数组的缺点:

  分配之后不能在改变大小;

 1 #include <iostream>
 2 #include <vector>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int bb[3];
 9     bb[0] = 1;
10     bb[1] = 2;
11     bb[2] = 3;
12 
13     //要将bb拷贝到bbb中,
14     //1、将bb中的数据拷贝到bbb中,
15     int bbb[10];    
16     bbb[0] = 1;
17     std::vector<int> ivec;
18     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
19     ivec.push_back(10);
20     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
21     ivec.push_back(10);
22     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
23     ivec.push_back(30);
24     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
25     ivec.push_back(40);
26     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
27     ivec.push_back(50);
28     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
29     ivec.push_back(60);
30     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
31     ivec.push_back(70);
32     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
33     ivec.push_back(80);
34     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
35     ivec.push_back(90);
36     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
37     ivec.push_back(90);
38     std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
39 
40     return 0;
41 }

运行结果如下:

 1 [root@linux cp]# g++ vector_demo.cpp  -g -Wall
 2 [root@linux cp]# ./a.out
 3 实际使用大小:0,容器的容量0    //0
 4 实际使用大小:1,容器的容量1    //2^0
 5 实际使用大小:2,容器的容量2    //2^1  
 6 实际使用大小:3,容器的容量4       //2^2
 7 实际使用大小:4,容器的容量4    //2^2
 8 实际使用大小:5,容器的容量8    //2^3
 9 实际使用大小:6,容器的容量8    //2^3
10 实际使用大小:7,容器的容量8
11 实际使用大小:8,容器的容量8
12 实际使用大小:9,容器的容量16
13 实际使用大小:10,容器的容量16

结果分析:

  1、vector增长的过程是一个按照2的指数级增长的;

  2、第11行到第12行过程中,存在一个从旧数组拷贝数据到新数组的过程;

vector的reserve()函数:

  ivec.reserve(100);  //将capacity增加到100; 

//在前段代码基础上,加入以下代码:
    ivec.reserve(100);
    std::cout <<"reserve 之后实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;    while(ivec.size() != ivec.capacity())
        ivec.push_back(99);
    std::cout <<"reserve 之后实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
    ivec.push_back(99);    std::cout <<"reserve 之后实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
    return 0;
}

运行结果如下:

 1 [root@linux cp]# ./a.out
 2 实际使用大小:0,容器的容量0
 3 实际使用大小:1,容器的容量1
 4 实际使用大小:2,容器的容量2
 5 实际使用大小:3,容器的容量4
 6 实际使用大小:4,容器的容量4
 7 实际使用大小:5,容器的容量8
 8 实际使用大小:6,容器的容量8
 9 实际使用大小:7,容器的容量8
10 实际使用大小:8,容器的容量8
11 实际使用大小:9,容器的容量16
12 实际使用大小:10,容器的容量16
13 reserve 之后实际使用大小:10,容器的容量100
14 reserve 之后实际使用大小:100,容器的容量100
15 reserve 之后实际使用大小:101,容器的容量200

总结:各种编译工具实现vector增长方式不一致;例如:vs中,在capacity为100时候,size也为100,加入一个数据,capacity增加为150;

   而g++中直接增加到200;

 

posted on 2015-06-21 22:55  阳台  阅读(336)  评论(0编辑  收藏  举报

导航