bind是标准库函数,定义在头文件functional中,可以将bind函数看作一个通用函数适配器,它接受一个可调用对象,生成一个新的可调用对象来适应元对象的参数列表。
auto newCallable = bind(originCallable, arg_list);
newCallable会调用originCallable,并传递给它arg_list中的参数。arg_list中含有_1
或者_2
这样的占位符,使用名字空间std:placeholders
。_n
代表newCallable接收到的从外部传来的第n个参数。
例子:
#include <iostream>
#include <fstream>
#Include <string>
#include <vector>
#include <algorithm>
using namespace std;
using namespace std::placeholders;
bool size_check(const string &s, size_t sz) {
return s.size() > sz;
}
int main(int argc, char **argv) {
ifstream f("test");
if (f) {
vector<string> v;
string tmp;
while (f >> tmp) {
v.push_back(tmp);
}
size_t sz = 6;
int cnt = count_if(v.begin(), v.end(), bind(size_check, _1, sz)); //_1为vector中的string,sz的6传递给了size_check的第二个参数
cout << "String longer than 6 number is " << cnt << endl;
} else {
eixt(1);
}
return 0;
}
例2
#include <iostream>
#include <fstream>
#Include <string>
#include <vector>
#include <algorithm>
using namespace std;
using namespace std::placeholders;
bool size_check(const string &s, size_t sz) {
return s.size() <= sz;
}
int main(int argc, char **argv) {
vector<int> v = {1,2,3,4,5,6,7,8,9};
string target;
cout << “Enter the target " << endl;
cin >> target;
auto itr = find_if(v.begin(), v.end(), bind(size_check, target, _1)); //_1是vector中的每个int值,找出string长度
cout << "The first number that longer than target is " << *itr << endl;
return 0;
}