博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL之vector详解
阅读量:5734 次
发布时间:2019-06-18

本文共 3054 字,大约阅读时间需要 10 分钟。

一、vector容器的自增长

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

数组的优点:

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

数组的缺点:

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

1 #include 
2 #include
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
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^310 实际使用大小:7,容器的容量811 实际使用大小:8,容器的容量812 实际使用大小:9,容器的容量1613 实际使用大小: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,容器的容量810 实际使用大小:8,容器的容量811 实际使用大小:9,容器的容量1612 实际使用大小:10,容器的容量1613 reserve 之后实际使用大小:10,容器的容量10014 reserve 之后实际使用大小:100,容器的容量10015 reserve 之后实际使用大小:101,容器的容量200

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

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

 

转载地址:http://nmmwx.baihongyu.com/

你可能感兴趣的文章
深圳联通特邀湖北籍企业参观公司总部大楼举行
查看>>
告警系统主脚本、告警系统配置文件、告警系统监控项目
查看>>
Python 和 PyCharm 在 windows10 环境的安装和设置
查看>>
C语言入门基础之数组——数学和编程的完美结合(图)
查看>>
《远见》的读后感作文1000字范文
查看>>
重置密码、单用户模式、救援模式
查看>>
LAMP环境搭建1-mysql5.5
查看>>
第三课 Linux目录及文件管理、用户组管理及bash重定向
查看>>
shell 脚本攻略--小试牛刀
查看>>
spring boot view override
查看>>
bzoj 2282: [Sdoi2011]消防
查看>>
我的友情链接
查看>>
centos5.9使用RPM包搭建lamp平台
查看>>
关于C#面向对象2
查看>>
Javascript String类的属性及方法
查看>>
vim编辑器如何添加或删除多行注释
查看>>
[LeetCode] Merge Intervals
查看>>
iOS开发-按钮的基本使用
查看>>
在QT和SDL搭建的框架中使用OPENGL在SDL窗口上进行绘图
查看>>
REST技术第三步 @BeanParam的使用
查看>>