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 [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^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 [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,容器的容量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;