STL 之 vector 查詢效能優化
阿新 • • 發佈:2018-11-04
如果一個數組元素不多,就沒必要做優化了。這裡要說的是一個大的陣列,在進行遍歷查詢元素的時候,優化和沒有優化的效果還是可以用肉眼看得出來的,下面是一個簡單的例子:
// vertor_test.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> #include <vector> #include <string> #include <sstream> #include <time.h> using namespace std; string int2str(int n) { stringstream ss; ss << n; string str = "string" + ss.str(); return str; } //class CData class CData { public: int id; string name; public: CData(int _id,string _name) { id = _id; name = _name; } }; int vector_find(int key, vector<CData>::iterator itrBegin, vector<CData>::iterator itrEnd, vector<CData>::iterator & itr) { itrEnd -= 1; vector<CData>::iterator itrMid = itrBegin + (itrEnd-itrBegin)/2; int count = 0; while(itrBegin <= itrEnd) { count++; if(itrMid->id == key) { itr = itrMid; cout<<"total search count:"<<count<<endl; return true; } else { if(itrMid->id < key){ itrBegin = itrMid + 1; } else{ itrEnd = itrMid - 1; } } itrMid = itrBegin + (itrEnd - itrBegin)/2; } itr = itrEnd; return false; } int main() { //構建一個大陣列 vector<CData> vect; for(int i = 0; i<100000; i++) { CData test(i, int2str(i)); vect.push_back(test); } cout<<"vector has builded!\r\n"<<endl; //常規遍歷方式耗時統計 cout << "default find mode:" << endl; clock_t start = clock(); vector<CData>::iterator it = vect.begin(); while(it != vect.end()) { if(it->id == 9999) { cout << "id : "<< it->id << "\tname : " << it->name << endl; break; } it++; } clock_t finish = clock(); cout << "take time(s):" << (double)(finish-start)/CLOCKS_PER_SEC << "\n"; //優化後的遍歷方式耗時統計 cout << "\r\nnew find mode:" << endl; clock_t start1 = clock(); vector<CData>::iterator itr; if(vector_find(9999, vect.begin(), vect.end(), itr)) { cout << "id : "<< itr->id << "\tname : " << itr->name << endl; } else { cout << "not found!" << endl; } clock_t finish1 = clock(); cout << "take time(s):" << (double)(finish1-start1)/CLOCKS_PER_SEC << "\n"; getchar(); return 0; }
列印結果:(常規遍歷耗時0.019秒,優化過的耗時:0.003秒)