2014-11-02 2 views
1

qsort_r으로 비교 함수에서 외부 매개 변수를 사용할 수 있습니다. 예를 들어,STL std :: qtort_r을 사용하여 정렬

int cmp_with_parameter(void *a, void *b, void *p) 
{ 
    return (int*)p[*(int*)a] - (int*)p[*(int*b)]; 
} 

int main() { 
    int values[] = {1,2,3,4}; 
    int arr[] = {0, 1, 2, 3}; 
    qsort_r(arr, 4, sizeof(arr[0]), cmp_with_parameter, values); 
} 

우리는 values[]의 값에 의해 int arr[]을 정렬 할 수 있습니다.

이제 std :: sort와 비슷한 함수를 구현하고 싶습니다. std :: sort에서 외부 값을 사용할 수 있습니까? 미리 감사드립니다.

+3

Functor 및/또는 익명 함수 개체 (또는 "lambda")를 읽습니다. – juanchopanza

+0

참조 나 다른 편의에 따라 매개 변수를 사용자 지정 비교기에로드하십시오. – WhozCraig

답변

3

std::sort()에 의해 수행 된 비교 함수는 적절한 정보가 들어있는 함수 객체가 될 수 있습니다. 예 :

std::sort(std::begin(arr), std::end(arr), 
      [=](int a, int b){ return values[a] < values[b]; }); 
+0

고마워, 작동합니다. 어쩌면 내가 lambada 표현에서 참조로 전달해야한다. –

+0

notbad가 맞다. [&]가 그의 경우에 사용되어야한다. –

+0

@OphirGvirtzer : 왜? 배열은 평소와 같이 쇠퇴하고 포인터가 캡처됩니다. 배열을 복사 할 수 없다는 점을 감안할 때 배열이 어떻게 다르게 작동하는지 알 수 없습니다. –

3

functor을 비교 자로 만들어야합니다. 일반적인 방법은 에 과부하가 호출 연산자와 struct를 사용하고 만들려면 :

struct cmp_with_parameter 
{ 
    const int* values; // keep a pointer to the external array 

    cmp_with_parameter(const int* values): values(values) {} 

    // overloading this operator allows an object 
    // of this struct to be called like a function. 
    bool operator()(int a, int b) const 
    { 
     return values[a] < values[b]; 
    } 
}; 

int main() 
{ 
    int values[] = { 1, 2, 3, 4 }; 
    int arr[] = { 0, 1, 2, 3 }; 
    std::sort(arr, arr + sizeof(arr)/sizeof(arr[0]), cmp_with_parameter(values)); 

    // ... 
} 

하면 컴파일러는 C++ 11 당신이 std::sort() 매개 변수를 단순화 할 수 있습니다 지원하는 경우 :

int main() 
{ 
    int values[] = { 1, 2, 3, 4 }; 
    int arr[] = { 0, 1, 2, 3 }; 
    std::sort(std::begin(arr), std::end(arr), cmp_with_parameter(values)); 

    // ... 
} 

을 Wikipedia는이 문제를 해결하는 방법에 대한 좋은 예입니다. Function Object:C/C++

+0

end iterator를 찾는 방법은 다음과 같이 극적으로 향상시킬 수 있습니다 :'std :: sort (std :: begin (arr), std :: end (arr), cmp_with_parameters (values))'. –

+0

@ DietmarKühl 감사합니다. 전 C++ 11을 유지하고 있었지만 유용한 메모로 제안을 추가하겠습니다. – Galik

+0

음, C++ 11은 현재 표준 인 C++ 14로 구식입니다. 누구나 pre-C++ 11을 고려하기를 원하는 이유는 (비록 기업들이 사용되는 C++ 버전에 제약이있을 수 있음을 알고 있지만) 다소 저쪽에 있습니다. ... 그리고 C++ 98에서도 간단히'end()'함수는 배열의 크기를 결정할 수 있습니다. –

관련 문제