我正在尝试学习std :: bind的工作原理。我写了以下内容:
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std::placeholders;
int fun2(int i,int j)
{
return i+j;
}
int fun(int i)
{
return i;
}
int main()
{
std::vector<int> v9={1,2,3,4,5,6,6,7};
std::transform(v9.begin(),v9.end(),v9.begin(),[](int i){return i;}); //works
std::transform(v9.begin(),v9.end(),v9.begin(),fun); //works
std::transform(v9.begin(),v9.end(),v9.begin(),std::bind(fun,_1)); //works
std::transform(v9.begin(),v9.end(),v9.begin(),std::bind(fun2,_1,_2)); //does not work
}
std :: transform也接受二进制运算函数。所以我尝试编写fun2并使用std :: bind(main的最后一行),但它不起作用。有人能给我一个std :: bind如何使用占位符(2,3或更多)的例子吗?
答案 0 :(得分:4)
带有二元仿函数的std::transform
的重载需要四个迭代器,而不是三个,因为它在两个输入范围上运行,而不是一个。例如:
#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
int fun2(int i,int j)
{
return i+j;
}
int main()
{
using namespace std::placeholders;
std::vector<int> v1={1,2,3,4,5,6,6,7};
std::vector<int> v2;
std::transform(v1.begin(), v1.end(), v1.begin(),
std::back_inserter(v2), std::bind(fun2,_1,_2));
for (const auto& i : v2)
std::cout << i << " ";
std::cout << std::endl;
}
当然,在现实生活中,你不会在这里使用std::bind
。