訪問vector元素方法的效率比較

Curtis_發表於2019-03-09

比較訪問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(),返回第一個元素的迭代器,最後一個元素的下一個位置的迭代器。

相關文章