2013-05-20 39 views
0

我想了解std :: bind如何工作。我写了以下内容:在C++中使用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

'std :: transform'只传递一个参数。你的意思是做'std :: bind(fun2,_1,5)'吗? – chris

+3

除了当它通过两个:[(2)](http://en.cppreference.com/w/cpp/algorithm/transform :) :) – jrok

+2

如果你不'使用'std :: bind'确实没有意义, t绑定任何参数。 –

回答

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

+0

你说得对,我的错。 'std :: transform(v9.begin(),v9.end(),v9.begin(),v9.end(),std :: bind(fun2,_1,_2));' –

+0

@AvraamMavridis:你确定该代码给你同样的错误?什么是完整的错误? (如果Visual Studio,完整的错误在“输出”窗口中,而不是“错误”窗口) –

+0

@MooingDuck代码(在注释中)不会给出任何错误,它会进行编译。 –