用C++的stl庫,相信大家都有用vector的經(jīng)歷,畢竟vector支持直接下標(biāo)方式取數(shù)據(jù)的確方便很多。
但是vector默認(rèn)是不提供find方法的,所以我們?cè)诓檎业臅r(shí)候,通常這樣寫代碼:
vector<int> vec;
for(unsigned int i = 0;i<vec.size();++i)
{
if(vec[i]==xxx)
{
break;
}
}
并不是說提供不了,而是stl庫中實(shí)際上已經(jīng)有通用的find函數(shù)(不止find……)
可以看一下下面的代碼:
int main(int argc,char* argv[])
{
vector<int> vec;
vec.push_back(123);
vec.push_back(456);
vector<int>::iterator findit = find(vec.begin(),vec.end(),123);
//vector<int>::iterator findit = find(vec.begin(),vec.end(),111);
if(findit==vec.end())
{
printf("no find\n");
}
else
{
printf("find[%d]\n",*findit);
}
return 0;
}
這樣的寫法會(huì)不會(huì)簡(jiǎn)單很多呢?
需要說明的是,雖然這個(gè)通用的find方法也是可以用在map,set等上面的,但是效率會(huì)比容器內(nèi)部的find方法慢很多,所以,除非容器實(shí)在是沒有提供find方法,否則還是建議不要用公共的這一種。
另外,作為題外話,我們需要注意一下vector的刪除(erase)操作。由于vector需要能以下標(biāo)方式取數(shù)據(jù),所以必須時(shí)刻保證連續(xù)的存儲(chǔ)空間,對(duì)應(yīng)于實(shí)現(xiàn)上,即,當(dāng)刪除vector中間的一個(gè)成員時(shí),這個(gè)成員后面的所有成員,會(huì)以原順序向前全部拷貝過來。有興趣的朋友,可以用這個(gè)例子測(cè)試一下。
這里起碼告訴了我們兩件事:
1.vector中一個(gè)成員被刪除,會(huì)導(dǎo)致后面的成員進(jìn)行copy和析構(gòu)操作。
2.vector不適合做有大量插入刪除操作的容器,因?yàn)榭截悆?nèi)存本身浪費(fèi)很大
OK,到此為止啦~