map和vector的查詢方法

2021-04-21 00:11:55 字數 3738 閱讀 1153

在寫程式的時候,需要經常在

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的命名空...