find if 仿函式的使用

2021-06-05 06:20:02 字數 2520 閱讀 7267

有時我們要在map、vector容器中查詢符合條件的記錄,map提供乙個find的成員函式,但也僅限於查詢關鍵字滿足條件的記錄,不支援值域的比較。如果我們要在值域中查詢記錄,該函式就無能無力了。而vector甚至連這樣的成員函式都沒有提供。所以一般情況下進行值域的查詢,要麼自己遍歷資料,要麼求助於stl的find_if函式。前種方法我們這裡就不贅述了,只講find_if函式。

1 -- find_if的stl定義

template

inputiterator find_if(inputiterator first, inputiterator last,predicate pred)

find_if是乙個模板函式,接受兩個資料型別:inputitearator迭代器,predicate用於比較數值的函式或者函式物件(仿函式)。find_if對迭代器要求很低,只需要它支援自增操作即可。當前遍歷到的記錄符合條件與否,判斷標準就是使得pred()為真。至此可能還有些不是很明了,下面舉幾個例子實際操練下的它的用法。

2 -- find_if在std::map查詢時的應用

假如我們有個map物件是這麼宣告的:

std::map my_map;

my_map.insert(std::make_pair(10, "china"));

my_map.insert(std::make_pair(20, "usa"));

my_map.insert(std::make_pair(30, "english"));

my_map.insert(std::make_pair(40, "hongkong"));

#include

<

map>

2 #include

<

string

>

3 4 

class

map_finder

5 8 

booloperator

()(const

std:

:map

<

int,

std:

:string

>::

value_type

&pair)

9 12 

private:

13const

std:

:string

&m_s_cmp_string;

14 }

;15 

16int

main()

17 

class map_finder即用於比較的函式物件,它的核心就是過載的()運算子。因為每個容器迭代器的*運算子得到的結果都是該容器的value_type值,所以該運算子的形參就是map迭代器指向的value_type型別的引用。而map的value_type到底是什麼型別,就得看下stl的源**是如何定義的。

template

class map

;

從上面的定義可以看出,map的value_type是std::pair型別,它的first值就是關鍵字,second值儲存map的值域。

3 -- find_if在std::vector的應用

vector的find_if用法與map的很相似,區別僅僅是二者的value_type不一樣而已。我們看下vecotr對value_type的定義。

template

class vector

;

可以看出vector的value_type就是容器的值型別,了解了這點,我們做個vector的find_if示範。

1 #include

<

vector

>

2 #include

<

string

>

3 4 

struct

value_t5 ;

9 10 

class

vector_finder

11 14 

booloperator

()(const

std:

:vector

<

struct

value_t

>::

value_type

&value)

15 18 

private:

19int

m_i_a;

20 }

;21 

22 23 

int

main()

24 

仿函式使用要領

仿函式,又或叫做函式物件,是 stl 標準模板庫 六大元件 容器 配置器 迭代器 演算法 配接器 仿函式 之一 仿函式雖然小,但卻極大的拓展了演算法的功能,幾乎所有的演算法都有仿函式版本。例如,查詢演算法 find if 就是對find 演算法的擴充套件,標準的查詢是兩個元素向等就找到了,但是什麼是...

python 仿函式 C 仿函式

c 的標準庫stl裡面有6大部件,其中之一為仿函式。初始看到這一名字可能讓人摸不著頭腦 函式倒是挺容易理解,何故又起個仿函式的名字呢?本文將帶你揭開它看起來挺讓人迷惑但是實際上很簡單的面紗。仿函式,看名字就知道它肯定和函式有什麼關聯,但是也肯定和函式有什麼區別。函式主要是一塊接收輸入引數然後按照一定...

仿函式 C 中仿函式的應用

仿函式 c 中仿函式的應用 在使用仿函式的時候,主要用到以下兩種 一種是以基類std unary function派生出來的派生類 另一種是以基類std binary function派生出來的派生類。而這兩種有什麼區別呢?它們之間的區別只是第一種接收的引數個數為乙個,而第二種接收的引數的個數為兩個...