用C++的stl庫,相信大家都有用vector的經歷,畢竟vector支持直接下標方式取數據的確方便很多。
但是vector默認是不提供find方法的,所以我們在查找的時候,通常這樣寫代碼:
vector<int> vec;
for(unsigned int i = 0;i<vec.size();++i)
{
if(vec[i]==xxx)
{
break;
}
}
并不是說提供不了,而是stl庫中實際上已經有通用的find函數(不止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;
}
這樣的寫法會不會簡單很多呢?
需要說明的是,雖然這個通用的find方法也是可以用在map,set等上面的,但是效率會比容器內部的find方法慢很多,所以,除非容器實在是沒有提供find方法,否則還是建議不要用公共的這一種。
另外,作為題外話,我們需要注意一下vector的刪除(erase)操作。由于vector需要能以下標方式取數據,所以必須時刻保證連續的存儲空間,對應于實現上,即,當刪除vector中間的一個成員時,這個成員后面的所有成員,會以原順序向前全部拷貝過來。有興趣的朋友,可以用這個例子測試一下。
這里起碼告訴了我們兩件事:
1.vector中一個成員被刪除,會導致后面的成員進行copy和析構操作。
2.vector不適合做有大量插入刪除操作的容器,因為拷貝內存本身浪費很大
OK,到此為止啦~