訪問vector元素方法的效率比較
阿新 • • 發佈:2019-02-10
相信會來看這篇部落格的人,應該都認識vector了,所以我就直接上測試程式碼了,我是在vs2015中測試的:
#include<iostream>
#include<vector>
#include<windows.h>
using namespace std;
int main() {
//建立4個vector,使用列表初始化,相當與呼叫拷貝建構函式
vector<int> v1;
int temp;
int i;
for (i = 0; i < 100000; ++i) {
v1.push_back(i);
}
//測試1
DWORD start,end;
start= GetTickCount();
for (i = 0; i < v1.size(); ++i) {
temp=v1[i];
}
end = GetTickCount();
cout << "使用[]運算子耗時:" << end - start << "ms" << endl;
//測試2
start = GetTickCount();
for (auto k = v1.begin(); k < v1.end(); ++k)
{
temp = *k;
}
end = GetTickCount();
cout << "使用迭代器(++k)耗時:" << end - start << "ms" << endl;
//測試3
start = GetTickCount();
for (auto k = v1.begin(); k < v1.end(); k++)
{
temp = *k;
}
end = GetTickCount();
cout << "使用迭代器,使用k++,而不是++k:" << end - start << "ms" << endl;
//測試4
start = GetTickCount();
i = 0;
for (auto k = v1.begin(); i<v1.size(); ++i,++k)
{
temp = *k;
}
end = GetTickCount();
cout << "使用迭代器,不使用end()方法:" << end - start << "ms" << endl;
system("pause");
return 0;
}
輸出:
OK,從分析結果:
當然,如我們只是單純的從前面兩個結果來看,你會發現使用下標運算子的效率會比使用迭代器高一些。其實主要是在訪問迭代器是要進行迭代器越位、有效性、是否指向同一容器等方面的判斷,比較耗時。我們會發現測試4就是驗證我我們的假設,因為執行end()函式是比較耗時的,所以我就不用它,發現迭代器訪問會比下標還快。除了這些差別外,我們比較測試2和測試3的結果,會發現測試3比測試2慢了兩倍,其實這個也就是為啥我們推薦在寫:++k和k++的時候,能用++k,就用++k的原因。