zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    布局重用 include merge ViewStub
    AS 常用插件 MD
    AS 2.0新功能 Instant Run
    AS .ignore插件 忽略文件
    AS Gradle构建工具与Android plugin插件【大全】
    如何开通www国际域名个人网站
    倒计时实现方案总结 Timer Handler
    AS 进行单元测试
    RxJava 设计理念 观察者模式 Observable lambdas MD
    retrofit okhttp RxJava bk Gson Lambda 综合示例【配置】
  • 原文地址:https://www.cnblogs.com/chris-cp/p/4592614.html
Copyright © 2011-2022 走看看