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 [[email protected] cp]# g++ vector_demo.cpp  -g -Wall
 2 [[email protected] 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 [[email protected] 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;

时间: 2024-10-23 11:14:26

STL之vector详解的相关文章

【转】【STL】vector详解

转自:http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors   vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector> 构造函数.

C++ STL之vector详解

Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector> 构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在

STL之set详解(二)

首先来看看set集合容器: set集合容器实现了红黑树的平衡二叉树数据结构,在插入元素时它会自动调整二叉树的排列,把该元素放到适当的位置,并且 保证左右子树平衡.平衡二叉检索树采用中序遍历算法. 对于set,vector,map等等,它们的前向迭代器定义是这样的(以set为例): set<int>::iterator it; for(it=s.begin();it!=s.end();it++){} 那么反向迭代器呢? set<int>::reverse_iterator rit;

STL中排序函数详解

排序(sort):所有sort算法介绍:使用的迭代器(iterator)都需是随机迭代器(RadomAccessIterator) 1.      所有 函数名功能描述 sort对给定区间所有元素进行排序 stable_sort对给定区间所有元素进行稳定排序 partial_sort对给定区间所有元素部分排序 partial_sort_copy对给定区间复制并排序 nth_element找出给定区间的某个位置对应的元素 is_sorted判断一个区间是否已经排好序 partition使得符合某个

【C++基础 04】vector详解

按照写博客的习惯一开始总要加点鸡汤文什么的,请原谅我今天想不起来. ============================================= 今天要写的内容是顺序型容器.首先,标准库定义了三种顺序容器类型:vector,list和deque(双端队列),这篇博客介绍的是vector容器. 首先要知道,vector不是一种数据类型,而是一个类模板,可以用来定义任意多种数据类型,比如说vector<int>是一种数据类型,vector<string>也是一种数据类型.

java集合(二)List集合之Vector详解

简介Vector的内部实现类似于ArrayList,Vector也是基于一个容量能够动态增长的数组来实现的,该类是JDK1.0版本添加的类,它的很多实现方法都加入了同步语句,因此是线程安全的(但Vector其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全,我们后面会有例子来说明这一点). Vector类声明如下 public class Vector<E> extends AbstractList<E> implements List<E>, Random

C++ STL vector详解

一.解释:  vector(向量):是一种顺序容器,事实上和数组差不多,但它比数组更优越.一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界.而vector正好弥补了这个缺陷,它的特征是相当于可分配拓展的数组,它的随机访问快,在中间插入和删除慢,但在末端插入和删除快. 二.用法: 1.头文件 #include <vector> 2.定义方式 a) vector<int>v1;//vector元素为 int 型 b) vector<string>v2

[GeekBand] STL 仿函数入门详解

本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格  http://www.leavesite.com/ 前言:本文主要通过关联容器set解释下仿函数的实现及工作原理. 一.STL六大组件简介 1.Containers(容器):各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据2.Algorithms(算法):如. Sort,Search.3.Iterators(

c++ vector详解

容器有太多需要清楚细节的地方,同时也有太多值得学习的地方.下文作为学习.工作中用到vector的总结. 1. 赋值运算=的实现原理 在使用赋值操作时,如果不清楚内部是怎么实现,那么用起来会畏手畏脚. 先来看下stl_vector.h中对于=的重载函数. template <class T, class Alloc> vector<T, Alloc>& vector<T, Alloc>::operator=(const vector<T, Alloc>