目录前言分析vector不同操作对时间的影响1.for循环中使用 size()成员函数2.初始化时初始化为0与其他值3.vector分配容量问题4. vector赋值操作5. 遍历下标和迭代器总结前言打怪升级第90天分析vector不同操作对时间的影响1.for循环中使用 size()成员函数#includeiostream#includectime// time_t, clock#includevectorusingnamespacestd;#defineNUM1000000voidtest_time_1(){vectorintv1(NUM);for(inti0;iNUM;i)v1[i]i;intk0;time_t begin1clock();for(inti0;iv1.size();i){for(intj0;jv1.size();j){k;}}time_t end1clock();k0;time_t begin2clock();size_t sizev1.size();for(inti0;isize;i){for(intj0;jsize;j){k;}}time_t end2clock();coutv1.size(), time: end1-begin1endl;coutsize, time: end2-begin2endl;}结果debug下使用变量快很多很多20倍左右release下两者差别不大。结论在release模式下可能编译器对函数调用做了很大优化但是循环中还是推荐使用变量保存size否则每次循环都需要调用 size()成员函数量级大的情况下消耗还是不小的。2.初始化时初始化为0与其他值#defineNUM100000000voidtest_time_2(){time_t begin1clock();// vectorintv1(NUM);vectorvectorintv1(NUM,vectorint(NUM));time_t end1clock();time_t begin2clock();//vectorintv2(NUM, 0);vectorvectorintv2(NUM,vectorint(NUM,0));time_t end2clock();time_t begin3clock();// vectorintv3(NUM, -1);vectorvectorintv3(NUM,vectorint(NUM,1));time_t end3clock();coutinit empty, time: end1-begin1endl;coutinit zero, time: end2-begin2endl;coutinit 100, time: end3-begin3endl;}结果a. 一维数组不初始化或者初始化为0都比较快如果初始化为其他值1也好3423121也好时间消耗都会增大很多20倍左右同时不同初始化值所用时间是一样的b. 二维数组三者时间差别不大。结论如果后续需要输入其他数据不初始化即可如果不是必要不建议刚开始就全部初始化为非0值。3.vector分配容量问题#defineNUM100000000voidtest_time_3(){time_t begin1clock();vectorintv1(NUM);time_t end1clock();time_t begin2clock();vectorintv2;v2.resize(NUM);time_t end2clock();time_t begin3clock();vectorintv3;v3.reserve(NUM);// v3.resize(NUM); // 在加一个resize时间消耗基本无差别time_t end3clock();coutinit, time: end1-begin1endl;coutresize, time: end2-begin2endl;coutreserve, time: end3-begin3endl;}结果声明位置设置大小以及使用resize、reserve时间消耗差不多reverse用时略小因为不用初始化数据。结论数据量在百万以内差别不大如果后面需要输入数据推荐使用resize至于原因请看第四个测试用例。4. vector赋值操作#defineNUM10000000voidtest_time_4(){time_t begin1clock();vectorintv1;// 初始不设置大小for(inti0;iNUM;i){intti;v1.push_back(t);// 模拟 cin num;// v.push_back(num);}time_t end1clock();time_t begin2clock();vectorintv2(NUM);for(inti0;iNUM;i){v2[i]i;// 模拟cin v[i];}time_t end2clock();coutt - v[i], time: end1-begin1endl;coutv[i], time: end2-begin2endl;}结果调用push_back消耗很大 – 10倍以上结论不推荐借用中间变量后调用push_back,推荐直接使用 v[i]接收数据5. 遍历下标和迭代器#defineNUM100000000voidtest_time_5(){vectorintv1(NUM);for(inti0;iNUM;i)v1[i]i;// 测试下标遍历和迭代器遍历的速度time_t begin1clock();size_t sizev1.size();for(size_t i0;isize;i)v1[i]0;time_t end1clock();/* // 范围for的底层实现使用的迭代器 vectorint::iterator it v1.begin(); while (it ! v1.end()) { *it 0; it; } */time_t begin2clock();for(autoe:v1)e0;time_t end2clock();coutv1[i], time: end1-begin1endl;coutiterator, time: end2-begin2endl;}结果debug条件下迭代器访问的速度要快很多很多– 10倍以上release条件下访问速度相差不大。结论推荐在能使用迭代器的条件下尽量使用迭代器访问既范围for那么什么时候适合使用 – 不需要使用下标的情况下。总结在for循环中如果使用到成员变量如size()作为判断十分推荐将该值保存到一个临时变量之后使用临时变量来代替它进行判断否则调用多次进行函数调用会拖慢CPU运算速度声明容器变量是是否初始化大小都可以因为在任何地方都一样当然如果需要给容器数据初始化如果不是一定要使用某些值不建议初始化为非0值vector添加成员时十分推荐先开好空间之后直接通过下标 v[i] 进行赋值如果借用一个临时变量再进行push_back()也会大大拖慢cpu指向速度遍历容器时如果我们不需要使用下标就十分推荐使用范围for。以上的建议都是针对数据量大的情况下使用的百万、千万以上的量级如果平时使用100、10000等小量级则差别不大不过好习惯早早养成还是很有必要的希望本文可以为有需要的朋友提供帮助。