在寫程式的時候,需要經常在
map或者
vector
中查詢符合條件的記錄,而在
map和
vector
中都沒有提到查詢函式。在本文中,詳細說明了
find_if
用在map
和vector
中的用法。
我們首先看下在
stl中
find_if
是怎樣實現的
,然後就能寫出針對各種型別的
find_if函式.
//定義在
stl實現**
stl_algo.h
中template<classinputiterator,classpredicate>
inputiterator find_if(inputiterator first, inputiterator last,predicate pred)
可見stl是把
find_if
定義為乙個函式模板,該函式模板接收兩個資料型別,
inputitearator
是輸入的迭代器,
predicate
是用於比較的函式或者函式物件(仿函式)。這裡有個問題需要注意,那就是為什麼這裡要將比較函式定義為函式物件呢
?這個問題在下面進行分析下。
1.
map的查詢方法
如果給定
map的乙個
second
值,要求在該
map中找出與之相符的
map索引,則需要使用
stl的演算法
find_if
來查詢,而
find_if
的比較函式需寫為函式物件。下面是乙個示例:
//用於
map比較的函式物件
classcmapfindif
; ~cmapfindif(){};
public:
booloperator()(map::value_type &it)
private:
string _szfindstring;
}; 這個用於比較的函式物件實際上過載了
()運算子,因為在
find_if
函式中是這樣呼叫該函式物件的
pred(*first))
,實際上是將它作為乙個
bool key_comp()
函式使用的,在函式物件中的
()運算子的形參型別是比較物件的
value_type
,是因為
find_if
中傳入*first
的緣故。而
value_type
到底是什麼型別,下面有相信定義。
上面給出了仿函式的寫法,下面是針對
map的
find_if
使用方法。
map_m_fileacceptexename;
char szbuf[100];//
查詢值if( find_if(_m_fileacceptextname.begin(),_m_fileacceptextname.end(),
cmapfindif(string(szbuf))) != _m_fileacceptextname.end() )
returntrue;
else
returnfalse; 在
stl_map.h
標頭檔案中定義有以下的
map::value_type
。可見map
的value_type
是pair
型別的資料型別。
template<classkey,classt,classcompare,classalloc = alloc>
classmap
;map
的iterator
的定義是在
stl_tree.h
中,定義如下:
template<classkey,classvalue,classkeyofvalue,classcompare,
classalloc = alloc>
classrb_tree
;
2.
vector的查詢方法
vector
的查詢這裡有兩種方法,乙個是定義查詢函式,另乙個是定義仿函式。
if( vto.size() == 1 && find_if(vto.begin(), vto.end(),find_qq) != vto.end() )
boolfind_qq(string &szmail)//find_qq(vector::value_type )
上面的vector
查詢方式是呼叫函式的查詢,僅能查詢符合某一條件的資料,而在實際情況中可能需要查詢不同條件的資料,所以此處我們也使用函式物件(仿函式)方法實現乙個。
classcvecfindfun
~cvecfindfun(){}
private:
string m_szfindstring;
public:
//bool operator() (string &vecvalue)
booloperator() (vector::value_type &vecvalue)
};
template<classt,classalloc = alloc>
classvector ;
2.map
插入時的排序
把比較函式寫成函式物件才可以的,比如
: classcomper
};typedefstd::mapint, comper> mymap;
intmain(intargc,char* argv)
STL中vector和map的查詢和刪除
目前vector 和map 是stl 中最常用的兩個容器,在使用 vector 或map 時,根據需要會在容器中查詢,然後刪除,下面總結一下實際測試中正確的結果。查詢 map的查詢可是使用 find 函式。map int,cstring iterator iter iter mapintstring...
uva11991 map和vector的入門
給你乙個長度為n的陣列,進行m次詢問,每次詢問輸入k和v,輸出第k次出現v時的下標是多少。n 1e6 用vector動態開空間,map使數值結合。map每次查詢效率大約為logn。map的學習資料 1 include2 include3 include4 include5 include6 incl...
vector方法和使用
在一邊摸索中一邊學習了stl,這裡介紹一些vector的基本用法。include include 向量標頭檔案 include 演算法,提供一下函式 using std cin using std cout using std endl using std vector vector在std的命名空...