日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

bind() c语言,c/c++ 标准库 bind 函数详解

發布時間:2025/3/8 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bind() c语言,c/c++ 标准库 bind 函数详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

bind函數定義在頭文件 functional 中。可以將 bind 函數看作一個通用的函數適配器,它接受一個可調用對象,生成一個新的可調用對象來“適應”原對象的參數列表。

bind函數:接收一個函數名作為參數,生成一個新的函數。

auto newCallable = bind(callbale, arg_list);

arg_list中的參數可能包含入_1, _2等,這些是新函數newCallable的參數。

在這篇博客lambda 表達式 介紹 中,討論了find_if的第三個參數的問題,當時是用lambda表達式解決的,有了bind函數后,也可以用bind函數解決。

解決辦法:bind(check_size, _1, sz)

auto idx = find_if(svec.begin(),svec.end(),bind(check_size, _1, 6));

其實,newCall= bind(check_size, _1, sz)返回了一個新的函數newCall ,這個newCall 只接受一個參數,正好滿足find_if的要求。

?從find_if的角度來看,啊,newCall是含有一個參數的函數,OK,沒問題。

?從程序猿的角度看,check_size是含有2個參數的函數,只是提前把sz(6)綁定到了newCall上了,

?當調用newCall(s),實際是調用了check_size(s, 6),相當于newCall也有2個參數,只是第二個參數有個默認值為6。newCall(const string &s, size_t sz = 6); ,所以調用newCall時,傳遞一個參數就夠了。

注意:_1,_2等,是放在了命名空間placeholder中,所以要使用:

//_1,_n定在std::placeholders里面

using namespace std::placeholders;

bind參數用法:

//g是以個有2個參數的可調用對象

auto g = bind(func, a, b, _2, c, _1);//func是有5個參數的函數

調用g(X, Y), 等于 func(a, b, Y, c, X)

例子:

#include

#include

#include

#include

#include

using namespace std;

//_1,_n定在std::placeholders里面

using namespace std::placeholders;

bool check_size(const string &s, string::size_type sz){

return s.size() >= sz;

}

bool shorter(const string &a, const string &b){

return a.size() < b.size();

}

ostream& print(ostream& os, const string &s, const char &c){

//c = ',';

return os << s << c;

}

int main(){

/*

//用bind實現了和lambda一樣的功能

vector svec{"aab","d","aa","bb","e","bbb"};

stable_sort(svec.begin(),svec.end(),[](const string &a, const string &b){

return a.size() < b.size();

});

string::size_type sz = 3;

auto idx = find_if(svec.begin(),svec.end(),bind(check_size, _1, sz));

cout << *idx << endl;

idx = find_if(svec.begin(),svec.end(),[sz](const string &s){

return s.size() >= sz;

});

cout << *idx << endl;

*/

/*

//用bind改變原來函數的參數的位置

//升序

vector svec{"aab","d","aa","bb","e","bbb"};

sort(svec.begin(), svec.end(), shorter);

for(auto const &s : svec){

cout << s << " ";

}

cout << endl;

//由于調換了shorter參數的位置,所以變成了降序

sort(svec.begin(), svec.end(),bind(shorter, _2, _1));

for(auto const &s : svec){

cout << s << " ";

}

cout << endl;

*/

//bind引用,必須使用ref或者cref函數,把對象轉化成引用,不能用&

ostream &os = cout;

const char c = ' ';

vector svec{"aab","d","aa","bb","e","bbb"};

for_each(svec.begin(),svec.end(),[&os, c](const string &s){

os << s << c;

});

os << endl;

for_each(svec.begin(),svec.end(),bind(print, ref(os), _1, cref(c)));

os << endl;

cout << c << endl;

}

總結

以上所述是小編給大家介紹的c/c++ 標準庫 bind 函數詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

總結

以上是生活随笔為你收集整理的bind() c语言,c/c++ 标准库 bind 函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。