STL演算法find if和find

2022-05-03 03:24:10 字數 1439 閱讀 7313

根據effective stl的rule,從效率和正確性角度考慮,使用stl的演算法要比自己寫迴圈遍歷要effective。之前一直沒講究過這個。從現在起,要注意起來了。先學起來下面三個

1. find

2. find_if

3. for_each

它們都會用到mem_fun, mem_fun1(可以接受乙個引數),bind2nd(ptr_fun(funcname), argument)。詳見下面的例子(來自:

比如我們有下面的類: class

clxecs;};

和下面的乙個vector:

vector

<

clxecs

*>

vecs;

for(

inti =0

; i 

<

13; i++)

如果要對容器vecs中的所有物件都進行dosomething()的操作,可以用下面的方法:

for_each(vecs.begin(), vecs.end(), mem_fun(

&clxecs::dosomething));

// 對每個element呼叫其成員函式dosomething()

(關於mem_fun的用法可以參考我的那篇《stl中mem_fun和mem_fun_ref的用法》)

當然,我們也可以用下面的方法:

intdosomething(

clxecs 

*pecs)

for_each(vecs.begin(), vecs.end(), 

&dosomething);

// 對每個element呼叫dosomething函式,把它自己當引數傳入。

從上面的**可以看到,兩種方法其實都是呼叫類clxecs的dosomething()方法。在這裡,方法dosomething()是沒有引數的,如果這個方法像下面那樣是有引數的,該用什麼方法傳遞引數呢?

class

clxecs

};這個時候就該我們的bind2nd登場了!下面是具體的**:

//mem_fun1是mem_fun支援乙個引數的版本

for_each(vecs.begin(), vecs.end(), bind2nd(mem_fun1(

&clxecs::dosomething), 

13));

或者:int

dosomething(clxecs 

*pecs, 

intivalue)

for_each(vecs.begin(), vecs.end(), bind2nd(ptr_fun(dosomething), 

13));

從上面的**可以看出,bind2nd的作用就是繫結函式子的引數的。可是stl只提供了對乙個引數的支援。如果函式的引數多於1個,那就無能為力了。

18 2 2 STL常用查詢演算法find if

1 include2 include3 using namespace std 4 include5 include6 include78 9 105.2.2 find if 11按條件查詢元素 12find if iterator beg,iterator end,pred 13 按值查詢元素,找...

80 C 常用查詢演算法 find if

2.find if 功能描述 按條件查詢元素 函式原型find if iterator beg,iterator end,pred 按值查詢元素,找到返回指定位置迭代器,找不到返回結束迭代器位置 beg開始迭代器 end結束迭代器 pred函式或者謂詞 返回bool型別的仿函式 include us...

STL 演算法細節

一 概論 1 質變演算法 會改變操作物件的值 2 非質變演算法 不改變操作物件的值 3 所有泛型演算法的前兩個引數都是一對迭代器 二 演算法的泛化過程 1 將乙個敘述完整的演算法轉化為程式 是任何訓練有素的程式設計師勝任愉快的工作。2 泛化是乙個漸進過程,從具體到抽象的過程。3 迭代器是乙個行為類似...