比如我們有下面的類:
class
clxecs;};
和下面的乙個vector:
vector
<
clxecs
*>
vecs;
for(
inti=0
;i<
13;i++)
如果要對容器vecs中的所有物件都進行dosomething()的操作,可以用下面的方法:
for_each(vecs.begin(),vecs.end(),mem_fun(
&clxecs::dosomething));
(關於mem_fun的用法可以參考我的那篇《stl中mem_fun和mem_fun_ref的用法》)
當然,我們也可以用下面的方法:
intdosomething(clxecs
*pecs)
for_each(vecs.begin(),vecs.end(),
&dosomething);
從上面的**可以看到,兩種方法其實都是呼叫類clxecs的dosomething()方法。在這裡,方法dosomething()是沒有引數的,如果這個方法像下面那樣是有引數的,該用什麼方法傳遞引數呢?
class
clxecs};
這個時候就該我們的bind2nd登場了!下面是具體的**:
//mem_fun1是mem_fun支援乙個引數的版本
for_each(vecs.begin(),vecs.end(),bind2nd(mem_fun1(
&clxecs::dosomething),
13));
或者:intdosomething(clxecs
*pecs,
intivalue)
for_each(vecs.begin(),vecs.end(),bind2nd(ptr_fun(dosomething),
13));
從上面的**可以看出,bind2nd的作用就是繫結函式子的引數的。可是stl只提供了對乙個引數的支援。如果函式的引數多於1個,那就無能為力了。
Bind2nd原始碼解析
例 transform coll1.begin coll1.end back inserter coll2 bind2nd multiplies 10 1 呼叫模板函式bind2nd,第乙個引數為multiplies臨時物件。template function bind2nd templateinl...
Bind2nd原始碼解析
例如 include include include include using namespace std intmain int argc,char ar 接著下面有bind2nd的具體實現 cout count if coll.begin coll.end bind2nd greater in...
c bind1st 和 bind2nd的用法
std bind1st 和 std bind2nd將二元函式轉換為一元函式,具體用法參加下面的 介紹了兩種使用方式,第一種是使用std less和std greater,第二種是使用自定義的仿函式。include include include include include include std...