本文共 3054 字,大约阅读时间需要 10 分钟。
一、vector容器的自增长
首先,我们知道vector容器是由数组做出来的;它具备了数组的优缺点.
数组的优点:
操作数据,读取速度很快,因为有下标;
数组的缺点:
分配之后不能在改变大小;
1 #include2 #include 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 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^310 实际使用大小:7,容器的容量811 实际使用大小:8,容器的容量812 实际使用大小:9,容器的容量1613 实际使用大小: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,容器的容量810 实际使用大小:8,容器的容量811 实际使用大小:9,容器的容量1612 实际使用大小:10,容器的容量1613 reserve 之后实际使用大小:10,容器的容量10014 reserve 之后实际使用大小:100,容器的容量10015 reserve 之后实际使用大小:101,容器的容量200
总结:各种编译工具实现vector增长方式不一致;例如:vs中,在capacity为100时候,size也为100,加入一个数据,capacity增加为150;
而g++中直接增加到200;
转载地址:http://nmmwx.baihongyu.com/