STL之vector详解

简介: 一、vector容器的自增长   首先,我们知道vector容器是由数组做出来的;它具备了数组的优缺点. 数组的优点:   操作数据,读取速度很快,因为有下标; 数组的缺点:   分配之后不能在改变大小; 1 #include 2 #include 3 4 usi...

一、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;

 

相关文章
|
6月前
|
存储 C++ 索引
C++:STL - vector
C++:STL - vector
74 1
|
6月前
|
算法 Java 容器
STL_vector
STL_vector
49 0
|
存储 C++ 容器
【C++】STL之vector操作
【C++】STL之vector操作
|
存储 算法 编译器
【剖析STL】vector
vector的介绍及使用 1.1 vector的介绍 cplusplus.com/reference/vector/vector/ vector是表示可变大小数组的序列容器。
44 0
|
存储 Linux C++
C++【STL】之vector的使用
C++ STL vector类常用接口详细讲解,干货满满!
117 0
C++【STL】之vector的使用
|
小程序 C++ 容器
C++ STL学习之【vector的使用】
vector 是表示可变大小数组的序列 容器,其使用的是一块 连续 的空间,因为是动态增长的数组,所以 vector 在空间不够时会扩容;vector 优点之一是支持 下标的随机访问,缺点也很明显,头插或中部插入效率很低,这和我们之前学过的 顺序表 性质很像,不过在结构设计上,两者是截然不同的
277 0
C++ STL学习之【vector的使用】
|
算法 C++ 容器
STL之vector
STL之vector
|
Linux 编译器 C++
【C++】-- STL之vector详解(二)
【C++】-- STL之vector详解
152 0
【C++】-- STL之vector详解(二)
|
存储 C++ 容器
【C++】-- STL之vector详解(一)
【C++】-- STL之vector详解
142 0
【C++】-- STL之vector详解(一)