第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如圖所示,binder1st是個(gè)類,那么binder1st (f2,val) f1是什么意思?

如圖所示,binder1st是個(gè)類,那么binder1st (f2,val) f1是什么意思?

C++
慕森卡 2023-04-21 17:13:59
c++自適應(yīng)二元函數(shù)轉(zhuǎn)化為自適應(yīng)一元函數(shù)如圖所示,binder1st是個(gè)類,那么binder1st (f2,val) f1是什么意思?理解不了??!
查看完整描述

1 回答

?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊

1、首先看一個(gè)容器的操作: 

void f(std::vector<int> &vect) 
{
std::vector<int>::iterator firstOne;
for (firstOne = vect.begin();
firstOne != vect.end();
++firstOne)
{
doSomething(*firstOne, "Some string literal");


這個(gè)f調(diào)用就是完成對(duì)容器vect的迭代,并在迭代過程中,處理iter值和一個(gè)不變的字符串,至于dosomething完成什么功能,根本不必關(guān)心。 
這里有人肯定要說,不是用for_each就可完成這種功能嗎,可for_each只接受一個(gè)參數(shù)的函數(shù)。如下所示: 
funcation for_each(iterator beg_it, iterator end_it, funcation func); 
那么怎樣讓func能夠綁定當(dāng)前iterator值和一個(gè)不變的字符串呢?如果成功,問題就OK了。 
在解決這個(gè)問題必須要用到適配器函數(shù),如bind1nd, bind2st之流的捆綁函數(shù)。在解析這兩個(gè)函數(shù)之前,先看看Funcation的類聲明: 
2、Funcation的類聲明: 
template <class Arg, class Arg2, class Res> 
struct binary_function {
typedef Arg first_argument_type;
typedef Arg2 second_argument_type;
typedef Res result_type; 
}; 
ok, 我們自己的func也可繼承這個(gè)基類,哈哈,改進(jìn)后的dosomething聲明: 
class dosomething:public 
std::binary_funcation<int, const char *, void> 

//其中,int是我們當(dāng)前iterator值類型,const char *是要傳遞的固定不變的字符串,void是我們func的返回值??纯聪旅娴闹剌d() 聲明,就明白了: 
public:
void operator()(int ival, const char *s)
{
// 在這里添加你想干的事情,記住,ival就是當(dāng)前iterator的值, s是需要綁定的不變字符串

}; 
3、bind1st和bind2nd的選擇 
從如上的dosomething可以看出,需要綁定的是s這個(gè)不變字符串,是第二個(gè)參數(shù),所以當(dāng)然選擇bind2nd,如果dosomething的聲明如下: 
class dosomething:public 
std::binary_funcation<const char *, int , void> 

//其中,int是我們當(dāng)前iterator值類型,const char *是要傳遞的固定不變的字符串,void是我們func的返回值。看看下面的重載() 聲明,就明白了: 
public:
void operator()(const char *s, int)
{
// 在這里添加你想干的事情,記住,ival就是當(dāng)前iterator的值, s是需要綁定的不變字符串

}; 
那么就當(dāng)然選擇bind1st了,因?yàn)樾枰壎ǖ牟蛔儏?shù)s是第一個(gè)參數(shù)。 
我靠,原來這兩個(gè)函數(shù)沒什么本質(zhì)區(qū)別,只是根據(jù)用戶定義函數(shù)參數(shù)的順序有關(guān)。 
4、現(xiàn)在看看改進(jìn)后的程序: 
#include <vector> 
#include <iostream> 
#include <functional> 
#include <iterator> 
#include <algorithm> 
void doSomething(const char *c, int i); 
// 我的第一個(gè)二元功能函數(shù), 
// 首先,我假定doSomething是某個(gè)庫函數(shù), 
// 我并沒有它的源代碼。 
// 關(guān)于可移植性:MS VC6.0不喜歡在模板的返回類型中使用void, 
// 所以在MS VC6.0中對(duì)operator( )稍作修改,使它返回一個(gè)類型(如true) 
struct doSomethingWrapper : public 
std::binary_function<const char *, int, void> 
{
// 實(shí)際上iValue就是iteraor的derefence值, cValue是不變的捆綁值
void operator()(const char *cValue, int iValue) const
{
doSomething(cValue, iValue);

}; 
// 現(xiàn)在,就建立了一個(gè)內(nèi)部的功能函數(shù)。 
// 關(guān)于可移植性,同上。 
struct doSomethingDirect : public 
std::binary_function<const char *, int, void> 
{
void operator()(const char *cValue, int iValue) const
{
std::cout << cValue
<< " "
<< iValue
<< ". " << std::endl;

}; 
// 這是個(gè)幫助器模板,因?yàn)槲冶容^懶,它能減少打字量。 
template <class Collection, class Function> 
Function for_all(Collection &c, const Function &f) 
{
return std::for_each(c.begin(), c.end(), f); 

int main() 

// 首先,建立vector。
std::vector<int> vect;
for (int i=1; i<10; ++i) {
vect.push_back(i);
}
for_all(vect, std::bind1st(doSomethingWrapper(), "Wrapper:"));
std::cout << "/n";
for_all(vect, std::bind1st(doSomethingDirect(), "Direct:"));
getchar();
return 0; 

// 我獨(dú)樹一幟的第三方庫函數(shù) 
void doSomething(const char *c, int i) 
{
std::cout << c << " " << i << ". " << std::endl; 

/* 運(yùn)行結(jié)果: 
Wrapper: 1. 
Wrapper: 2. 
Wrapper: 3. 
Wrapper: 4. 
Wrapper: 5. 
Wrapper: 6. 
Wrapper: 7. 
Wrapper: 8. 
Wrapper: 9. 
Direct: 1. 
Direct: 2. 
Direct: 3. 
Direct: 4. 
Direct: 5. 
Direct: 6. 
Direct: 7. 
Direct: 8. 
Direct: 9.


查看完整回答
反對(duì) 回復(fù) 2023-04-23
  • 1 回答
  • 0 關(guān)注
  • 161 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)