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;

  • 相关阅读:
    DAG:区块链行业下一个引爆点?
    php7的新特性
    Linux中的冷热页机制概述
    撰写后台需求文档需要注意的那些事儿
    poj 1201 Intervals
    poj 1364
    poj Candies
    hdu 1429
    poj A Round Peg in a Ground Hole
    poj 1113Wall
  • 原文地址:https://www.cnblogs.com/chris-cp/p/4592614.html
Copyright © 2011-2022 走看看