比较访问vector元素的两种方式:
一、使用下标访问;
二、使用迭代器(类似指针)访问。
代码:
#include<iostream>
#include<vector>
#include<windows.h>
using namespace std;
int main(){
vector<int> vec;
vec.resize(100010000);
//实验组一
int start=GetTickCount();
for(int i=0;i<vec.size();i++){
vec[i]=i;
}
int end=GetTickCount();
cout<<"实验组一: for循环中使用下标方式,i++方式,循环体内使用下标赋值 "<<endl;
cout<<(end-start)<<endl;
//实验组二
start=GetTickCount();
for(int i=0;i<vec.size();++i){
vec[i]=i;
}
end=GetTickCount();
cout<<"实验组二: for循环中使用下标方式,++i方式,循环体内使用下标赋值"<<endl;
cout<<(end-start)<<endl;
int i;
//实验组三
start=GetTickCount();
i=0;
for(vector<int>::iterator it=vec.begin();i<vec.size();i++,++it){
*it=i;
}
end=GetTickCount();
cout<<"实验组三: for循环中使用迭代器,迭代器++it方式,循环体内使用迭代器(向量)赋值 "<<endl;
cout<<(end-start)<<endl;
//实验组四
start=GetTickCount();
i=0;
for(vector<int>::iterator it=vec.begin();i<vec.size();i++,++it){
vec[i]=i;
}
end=GetTickCount();
cout<<"实验组四: for循环中使用迭代器,迭代器++it方式,循环体内使用下标赋值 "<<endl;
cout<<(end-start)<<endl;
//实验组五
start=GetTickCount();
i=0;
for(vector<int>::iterator it=vec.begin();i<vec.size();i++,it++){
*it=i;
}
end=GetTickCount();
cout<<"实验组五: for循环中使用迭代器,迭代器it++方式,循环体内使用迭代器(向量)赋值 "<<endl;
cout<<(end-start)<<endl;
//实验组六
start=GetTickCount();
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++){
*it=i;
}
end=GetTickCount();
cout<<"实验组六: for循环中使用迭代器,迭代器it++方式,用end()判断结束,循环体内使用迭代器(向量)赋值 "<<endl;
cout<<(end-start)<<endl;
return 0;
}
结果:

结论:
1、int型i,i++与++i速度相差无几; (对比一二,453, 454)
2、赋值时,迭代器访问要比下标访问快,即 *it=i 比 vec[i]=i 速度快; (对比三四,578,609)
3、对于迭代器 vector<int>::iterator it, ++it 比 it++ 快很多; (对比三五,578,1094)
4、用 it!=vec.end() 判断循环结束,耗时比较久; (对比五六, 1094, 1937)
5、总结:遍历vector时,用下标访问即可。
ps: vec.end(),返回最末元素的下一个位置的迭代器,求最末元素数值可用: *(vec.end()-1) 。
①、vec.front() ,vec.back(),返回第一个元素,最后一个元素;
②、vec.begin(), vec.end(),返回第一个元素的迭代器,最后一个元素的下一个位置的迭代器。
本文对比了通过下标和迭代器两种方式访问vector元素的效率,结果显示,对于int型,i++与++i速度相近;迭代器赋值比下标赋值快;++it比it++更快;而用it!=vec.end()判断循环结束耗时较长。结论是,遍历vector时,下标访问通常更优。注意,vec.end()返回最末元素的下一个位置,vec.front()和back()分别获取首尾元素,begin()和end()返回迭代器。

1845

被折叠的 条评论
为什么被折叠?



