STL之vector详解
一、vector容器的自增长
首先,我们知道vector容器是由数组做出来的;它具备了数组的优缺点.
数组的优点:
操作数据,读取速度很快,因为有下标;
数组的缺点:
分配之后不能在改变大小;
#include <iostream>
#include <vector> using namespace std; int main()
{
int bb[];
bb[] = ;
bb[] = ;
bb[] = ; //要将bb拷贝到bbb中,
//1、将bb中的数据拷贝到bbb中,
int bbb[];
bbb[] = ;
std::vector<int> ivec;
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back();
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl; return ;
}
运行结果如下:
[root@linux cp]# g++ vector_demo.cpp -g -Wall
[root@linux cp]# ./a.out
实际使用大小:,容器的容量0 //0
实际使用大小:,容器的容量1 //2^0
实际使用大小:,容器的容量2 //2^1
实际使用大小:,容器的容量4 //2^2
实际使用大小:,容器的容量4 //2^2
实际使用大小:,容器的容量8 //2^3
实际使用大小:,容器的容量8 //2^3
实际使用大小:,容器的容量8
实际使用大小:,容器的容量8
实际使用大小:,容器的容量16
实际使用大小:,容器的容量16
结果分析:
1、vector增长的过程是一个按照2的指数级增长的;
2、第11行到第12行过程中,存在一个从旧数组拷贝数据到新数组的过程;
vector的reserve()函数:
ivec.reserve(100); //将capacity增加到100;
//在前段代码基础上,加入以下代码:
ivec.reserve();
std::cout <<"reserve 之后实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl; while(ivec.size() != ivec.capacity())
ivec.push_back();
std::cout <<"reserve 之后实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(); std::cout <<"reserve 之后实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
return ;
}
运行结果如下:
[root@linux cp]# ./a.out
实际使用大小:,容器的容量0
实际使用大小:,容器的容量1
实际使用大小:,容器的容量2
实际使用大小:,容器的容量4
实际使用大小:,容器的容量4
实际使用大小:,容器的容量8
实际使用大小:,容器的容量8
实际使用大小:,容器的容量8
实际使用大小:,容器的容量8
实际使用大小:,容器的容量16
实际使用大小:,容器的容量16
reserve 之后实际使用大小:,容器的容量100
reserve 之后实际使用大小:,容器的容量100
reserve 之后实际使用大小:,容器的容量200
总结:各种编译工具实现vector增长方式不一致;例如:vs中,在capacity为100时候,size也为100,加入一个数据,capacity增加为150;
而g++中直接增加到200;
STL之vector详解的更多相关文章
- C++ STL之vector详解
转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作 ...
- stl——vector详解
stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...
- STL bind1st bind2nd详解
STL bind1st bind2nd详解 先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...
- C++ STL bitset 容器详解
C++ STL bitset 容器详解 本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧. \(bitset\)容器概论 \(bitset\)容器其实就是个\(01\)串 ...
- C++STL vector详解(杂谈)
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- C++ STL vector详解
一.解释: vector(向量):是一种顺序容器,事实上和数组差不多,但它比数组更优越.一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界.而vector正好弥补了这个缺陷,它 ...
- [GeekBand] STL 仿函数入门详解
本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格 http://www.leavesite. ...
- c++ vector详解
容器有太多需要清楚细节的地方,同时也有太多值得学习的地方.下文作为学习.工作中用到vector的总结. 1. 赋值运算=的实现原理 在使用赋值操作时,如果不清楚内部是怎么实现,那么用起来会畏手畏脚. ...
- C++ STL之LIST详解A
List 容器 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入删除元素. 使用list容 ...
随机推荐
- BZOJ 2314: 士兵的放置( 树形dp )
树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...
- HDU 3729 二分匹配 反向匹配
题意: 给定 n个学生 说的 自己 考试排名的 可能范围 确定最多几个人说真话 如果有多种答案,输出字典序最大的那种( 要求字典序最大,所以solve中从最大字典序开始匹配) 思路: 题目给定 点 ...
- mybatis foreach where test用法
<select id="selectAny" resultType="user" parameterType="user"> s ...
- GoWithTheFlow
GoWithTheFlow http://notes.jetienne.com/2011/07/17/gowiththeflow.js-async-flow-control-with-a-zen-to ...
- 关于struts2的checkboxlist、select等标签发生could not be resolved as a collection/array/map/enumeration/iterator type异常的记录
1 刚进入该界面的时候发生错误,原因是 list="roles"中的这个集合是空的,导致错误 解决办法很简单,不能让list为空 2 刚进入该界面的时候list是有数据的,当点击提 ...
- 卡特兰数(Catalan)简介
Catalan序列是一个整数序列,其通项公式是 h(n)=C(2n,n)/(n+1) (n=0,1,2,...) 其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, ...
- 84. 从视图索引说Notes数据库(下)
作用和代价上文介绍了关系型数据库里的索引.Notes数据库里的索引隐藏在视图概念里(本文的讨论仅仅针对Notes的视图索引,不包括全文索引.).开发者创建的视图仅仅是存放在数据库里的一条设计文档.数据 ...
- [cocos2dx笔记011]使用Cocostudio UI编辑器
本文地址:http://www.cppblog.com/zdhsoft/archive/2014/07/19/207715.html 笔记汇总:http://www.cppblog.com/zdhso ...
- Zookeeper 在Hadoop中的应用
Zookeeper 简单介绍 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目.它主要是用来解决分布式应用中常常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集 ...
- UISegmentedControl(分页控制器) AND UISlider(滑块控制器)
- (void)viewDidLoad { [super viewDidLoad]; UIImageView * animatedImageView = [[UIImageView alloc]ini ...