2013-05-20 2 views
0

와 표준 : : 바인딩의 사용.내가 어떻게 표준 : : 바인드 일을 배우려고 노력하고 C의 이항 연산 기능 ++

#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 
} 

표준이 :: 변환도 이항 연산 기능을 허용 : 나는 다음 썼다. 그래서 fun2 쓴 및 std :: bind (줄의 마지막 줄) 사용하려고했지만 작동하지 않습니다. 누군가가 std :: bind가 자리 표시 자 (2,3 이상)를 사용하는 방법을 보여줄 수 있습니까? 그것은 한 개의 입력 범위에서 동작하고 있지 때문에

+0

는'표준 : transform'는 하나 개의 인수를 전달합니다. 'std :: bind (fun2, _1, 5)'와 같은 것을하려고 했습니까? 이 통과 할 때 때를 제외하고 – chris

+3

이 : [(2)] (http://en.cppreference.com/w/cpp/algorithm/transform) : – jrok

+2

'표준을 사용하여 아무 소용이 정말 없다 :: bind' 당신이 돈이 ' 인수 중 하나를 바인드하지 마십시오. –

답변

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

네 말이 맞아, 내 실수 야. '표준은 :() _1, _2,,) (,,, 표준 : : 바인드 (Fun2에를 v9.end을 v9.begin()를 v9.end()를 v9.begin를()) 변환,' –

+0

@AvraamMavridis을 : 당신이 그 코드가 당신에게 같은 오류를 준다는 것을 확신 할 수 있습니까? 전체 오류는 무엇입니까? (Visual Studio의 경우 "오류"윈도우가 아닌 "출력"윈도우에 전체 오류가 있습니다.) –

+0

@MooingDuck 코드는 주석에 오류가 없으므로 컴파일됩니다. –