您的位置:首页 > 其它

STL之vector详解

2015-06-21 22:55 246 查看
一、vector容器的自增长

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

数组的优点:

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

数组的缺点:

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

#include <iostream>
#include <vector>

using namespace std;

int main()
{
int bb[3];
bb[0] = 1;
bb[1] = 2;
bb[2] = 3;

//要将bb拷贝到bbb中,
//1、将bb中的数据拷贝到bbb中,
int bbb[10];
bbb[0] = 1;
std::vector<int> ivec;
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(10);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(10);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(30);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(40);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(50);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(60);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(70);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(80);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(90);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;
ivec.push_back(90);
std::cout <<"实际使用大小:" << ivec.size() << ","<<"容器的容量"<< ivec.capacity() << std::endl;

return 0;
}


运行结果如下:

[root@linux cp]# g++ vector_demo.cpp  -g -Wall
[root@linux cp]# ./a.out
实际使用大小:0,容器的容量0    //0
实际使用大小:1,容器的容量1    //2^0
实际使用大小:2,容器的容量2    //2^1  
实际使用大小:3,容器的容量4       //2^2
实际使用大小:4,容器的容量4    //2^2
实际使用大小:5,容器的容量8    //2^3
实际使用大小:6,容器的容量8    //2^3
实际使用大小:7,容器的容量8
实际使用大小:8,容器的容量8
实际使用大小:9,容器的容量16
实际使用大小: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;
}


运行结果如下:

[root@linux cp]# ./a.out
实际使用大小:0,容器的容量0
实际使用大小:1,容器的容量1
实际使用大小:2,容器的容量2
实际使用大小:3,容器的容量4
实际使用大小:4,容器的容量4
实际使用大小:5,容器的容量8
实际使用大小:6,容器的容量8
实际使用大小:7,容器的容量8
实际使用大小:8,容器的容量8
实际使用大小:9,容器的容量16
实际使用大小:10,容器的容量16
reserve 之后实际使用大小:10,容器的容量100
reserve 之后实际使用大小:100,容器的容量100
reserve 之后实际使用大小:101,容器的容量200


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

   而g++中直接增加到200;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: