一、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详解的更多相关文章

  1. C++ STL之vector详解

    转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors   vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作 ...

  2. stl——vector详解

    stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...

  3. STL bind1st bind2nd详解

    STL bind1st bind2nd详解   先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...

  4. C++ STL bitset 容器详解

    C++ STL bitset 容器详解 本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧. \(bitset\)容器概论 \(bitset\)容器其实就是个\(01\)串 ...

  5. C++STL vector详解(杂谈)

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  6. C++ STL vector详解

    一.解释:  vector(向量):是一种顺序容器,事实上和数组差不多,但它比数组更优越.一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界.而vector正好弥补了这个缺陷,它 ...

  7. [GeekBand] STL 仿函数入门详解

    本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格  http://www.leavesite. ...

  8. c++ vector详解

    容器有太多需要清楚细节的地方,同时也有太多值得学习的地方.下文作为学习.工作中用到vector的总结. 1. 赋值运算=的实现原理 在使用赋值操作时,如果不清楚内部是怎么实现,那么用起来会畏手畏脚. ...

  9. C++ STL之LIST详解A

    List 容器 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入删除元素. 使用list容 ...

随机推荐

  1. objective-C学习笔记(六)继承与多态

    封装 encapsulation 隐藏对象内部实现细节,对外仅提供公共接口访问. (说白了就是属性啊,方法啊全都写在类内,对外只提供访问,不需要了解细节) 继承 inheritance     一个类 ...

  2. UVa202 Repeating Decimals

    #include <stdio.h>#include <map>using namespace std; int main(){    int a, b, c, q, r, p ...

  3. selenium 学习笔记 ---新手学习记录(6) 问题总结(java)

    1.查看网页的cookie信息 //查看cookie 登录后的cookie Set<Cookie> setcoke= driver.manage().getCookies(); for(C ...

  4. mybatis配置方法

    首先导入mybatis-3.1.1.jar包以及Mysql-connector-java-5.1.6-bin.jar包 新建一个数据库 create database mybatis; use myb ...

  5. web应用中Spring ApplicationContext的动态更新

    在web应用中时常需要修改配置,并动态的重新加载ApplicationContext.比如,设置和切换数据库.以下给出一个方法,并通过代码验证可行性. 方法的基本思路是,为WebApplication ...

  6. perl5 第六章 模式匹配

    第六章 模式匹配 by flamephoenix 一.简介二.匹配操作符三.模式中的特殊字符  1.字符+  2.字符 []和[^]  3.字符 *和?  4.转义字符  5.匹配任意字母或数字  6 ...

  7. JAVA FILE or I/O学习 - I/O流操作:FileInputStream、FileOutputStream、ObjectInputStream、ObjectOutputStream、InputStreamReader、OutputStreamWriter等

    public class IOStreamKnow { /*********************************文件读写方式:字节流**************************** ...

  8. 2014多校3 Wow! Such Sequence!段树

    主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=4893 这个问题还真是纠结啊--好久不写线段树的题了.由于这几天学伸展树.然后认为线段树小case了. ...

  9. Oracle PL/SQL 游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

  10. javaweb学习路之三--websocket多人在线聊天

    在之前的项目基础上,加入了一个聊天室的功能,为了界面好看 引入了AmazeUI和umeditor最终效果图如下: 源码在 https://github.com/Zering/MyWeb 目前练习都在这 ...