2017-12-20 21 views
-1

다음은 컴파일하지 않은 C++로 작성된 코드 조각입니다. 이유는 not1()을 사용하여 람다 함수의 결과를 반대로 변경하려고하기 때문입니다. 사람이 접근 방식의람다 함수 결과를 무효화하는 방법

#include <iostream>  // std::cout 
using namespace std; 
#include <functional> // std::not1 
#include <algorithm> // std::count_if 
#include <vector> 

int main() { 
    vector<int> sv = {3, 5, 10,12 }; 
    vector<int> v = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }; 
    auto validSelection = [&](auto& e) { 
     auto isSelected = [&] (auto& sve) { 
      return e == sve; 
     }; 
     return find_if(sv.begin(), sv.end(), isSelected) != sv.end(); 
    }; 
    stable_partition(v.begin(), next(v.begin(),8) , not1(validSelection)); 
    for (int n : v) { 
     std::cout << n << ' '; 
    } 
    std::cout << '\n'; 
    return 0; 
} 
+5

나는 "컴파일하지 않는다"는 오류 메시지가 아니라는 것을 꽤 잘 알고 있습니다. –

+1

왜'notl'을하기 위해 람다 (lambda)를 사용하지 않는가? (적어도 나에게는) 분명하다. –

+1

@appleapple 특히이 코드가 이미 필요하지 않은 곳에 람다를 사용할 때 – Slava

답변

2

하나는 래퍼 std::function를 사용하는 것입니다이 코드를 해결할 수 있다면 대단히 감사하겠습니다. 예를

auto even = [](int x) { return x % 2 == 0; }; 

std::cout << std::not1(std::function<bool(int)>(even))(11) << std::endl; 

에 대한 함수 객체 어댑터 not1 인수로 사용되는 해당 술어가 형식 정의의 이름 argument_typeresult_typestd::function 그들을 제공하는 래퍼를 가지고 있어야합니다. 귀하의 경우에는

에 해당하는 호출은 다음과 같을 것이다 :

stable_partition(v.begin(), next(v.begin(), 8) , not1(function<bool(int&)>(validSelection))); 

Demo.

아니면 내가 당신이에 도시 된 바와 같이 해당 코드를 볼 수 다음을 수행하려고 정확하게 무엇을 이해 한 경우 이 경우 다음과 같은 예시적인 프로그램

#include <iostream> 
#include <vector> 
#include <functional> 
#include <algorithm> 

int main() 
{ 
    std::vector<int> sv = { 3, 5, 10, 12 }; 
    std::vector<int> v = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }; 

    auto validSelection = [&](int x) 
    { 
     return std::binary_search(sv.begin(), sv.end(), x); 
    }; 

    std::stable_partition(v.begin(), v.end(), validSelection); 

    for (int x : v) std::cout << x << ' '; 
    std::cout << std::endl; 

    std::stable_partition(v.begin(), v.end(), std::not1(std::function<bool(int)>(validSelection))); 

    for (int x : v) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

출력은 0123이다

3 5 10 12 1 2 4 6 7 8 9 11 13 14 15 
1 2 4 6 7 8 9 11 13 14 15 3 5 10 12 

벡터 sv이 정렬되어 있기 때문에 std::binary_search 알고리즘을 사용하십시오.

+0

래퍼없이 작동하지 않는 이유를 설명해야합니다. "단항 술어 유형은 술어의 매개 변수 유형으로 변환 가능한 멤버 유형 argument_type을 정의해야합니다." – Slava

+0

실제로 벡터는 정렬되지 않습니다. 그것은 데모 목적으로 쓰여졌습니다. –

+0

@SabetayToros이 경우 std :: find (..)! = sv.end() 표현식을 std :: binary search로 대체 할 수 있습니다. –