2013-10-18 1 views
2

방금 ​​STL에서 STL에 대해 this lecture을 보았습니다.여러 인수 λ 식에 전달 된 매개 변수

예상대로
#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 

int main() 
{ 
    std::vector<std::string> v; 

    v.push_back("cat"); 
    v.push_back("antelope"); 
    v.push_back("puppy"); 
    v.push_back("bear"); 

    std::sort(v.begin(), v.end(), 
       [](const std::string& left, const std::string& right) 
        { 
         return left.size() < right.size(); 
        } 
      ); 

    for (std::vector<std::string>::iterator i = v.begin(); i != v.end(); ++i) 
    { 
     std::cout << *i << " "; 
    } 

    std::cout << std::endl; 

    return 0; 
} 

, 이것은 자신의 길이가 증가하는 순서로 벡터에서 문자열을 인쇄 : 강의 57 분 정도

, 우리는이 코드가 있습니다. 제 질문은 sort 함수의 세 번째 인수 인 람다 식에 대한 것입니다. 내부적으로 입력 매개 변수 'left'& 'right'로 전달되는 것은 무엇입니까?

나는 라인 추가 :

std::cout << "left: " << left << ", right: " << right << std::endl; 

람다의 몸 내부를, 그리고 내가 가진 출력했다 :

왼쪽 : 오른쪽 영양 : 고양이
왼쪽 : 영양, 오른쪽 : 고양이
왼쪽 : 강아지, 오른쪽 : 고양이
왼쪽 : 강아지, 오른쪽 : 영양
왼쪽 : 강아지, 오른쪽 : 고양이
왼쪽 : 곰, 오른쪽 : 고양이
왼쪽 : 오른쪽 곰 : 영양
왼쪽 : 곰, 오른쪽 : 강아지
왼쪽 : 곰, 오른쪽 : 고양이
곰 강아지 영양

그래서는 '왼쪽과 같은 고양이 '및'오른쪽 '인수는 어떻게 든 내부 정렬 알고리즘과 관련되어 있습니다. 누구가 정확히 무슨 일이 일어나고 있는지 더 많은 것을 밝힐 수 있습니까?

람다가 단항 함수 인 경우 입력 인자는 반복자가 현재 가리키고있는 것이었을 것이라는 것을 이해했습니다. 이 올바른지?
그러나 이진 함수를 사용하면 입력 인수가 문제가됩니다.

+0

내가 누락되었거나 왜 * 두 가지를 비교하는 비교 함수가 * 두 개의 매개 변수를 필요로하는지 묻고 있습니까? 정렬 알고리즘이 실행되는 동안 자주 항목을 비교하여 "순서"가 올바른지 확인하고 ** 항목 **에 ** s **를 강조합니다. – WhozCraig

+1

나는 비교 함수가 두 가지를 필요로한다는 것을 이해한다.내 질문은 '두 가지가 비교 자로 전달되는 것이며, 가능한 경우'어떻게 '인가하는 것입니다. 다른 말로하면, 프로그래머로서, 나는 람다 안에서 수행 할 수표를 결정할 수 있도록 입력 인수로 무엇을 얻을 것으로 기대할 수 있는가? – Gautam

+2

@ Gautam Ah. 당신은 당신의 순서대로 무엇이든 기대할 수 있습니다. 언제, 어떤 방법으로 나타날지는 전적으로 사용되는 알고리즘에 달려 있습니다. 특히 복잡한 객체의 여러 필드 값을 기반으로하는 명령을 작성하는 경우 철저히 엄격한 약한 정렬 개념을 완전히 이해하는 것이 좋습니다. – WhozCraig

답변

5

대부분의 정렬 알고리즘의 핵심은 두 요소를 비교하여 어느 요소를 앞에 놓아야하는지 결정하는 것입니다. 예를 들어, Wikipedia에서 가져온 quicksort입니다. 이 의사의 경우

function quicksort(array) 
    if length(array) ≤ 1 
     return array // an array of zero or one elements is already sorted 
    select and remove a pivot element pivot from 'array' // see '#Choice of pivot' below 
    create empty lists less and greater 
    for each x in array 
     *****if x ≤ pivot then append x to less***** this line here 
     else append x to greater 
    return concatenate(quicksort(less), list(pivot), quicksort(greater)) // two recursive calls 

는, 상기 비교는,이 이진 동작임을 xpivot 인 두 인수이

if x ≤ pivot 

공지이다. 표준 라이브러리 함수 std::sort의 경우,이 대신 다음과 같습니다 comp가 마지막 인수로 전달하는 펑터가

if (comp(x,pivot)) 

. 그래서, 여러분의 질문에 답하기 위해서 : 알고리즘의 논리에서 특정 시간에 비교할 필요가있는 범위의 2 요소가 무엇이든, "어느 것이 2 가지가 비교 자로 넘어가 는가".

+0

+1 : ... perf. :-) –

+0

답해 주셔서 감사합니다. 또한, 단일 인수 람다에 대한 나의 이해가 맞습니까? 질문에서 인용 : "... 람다가 단항 함수라면, 그것은 입력 인자가 반복자가 현재 가리키고있는 것이었을 것입니다 ..." – Gautam