1. 程式人生 > >STL 之 vector 查詢效能優化

STL 之 vector 查詢效能優化

如果一個數組元素不多,就沒必要做優化了。這裡要說的是一個大的陣列,在進行遍歷查詢元素的時候,優化和沒有優化的效果還是可以用肉眼看得出來的,下面是一個簡單的例子:

// 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秒)