根據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 迭代器是乙個行為類似...