>백엔드 개발 >C++ >C `std::sort`에서 멤버 함수를 비교자로 어떻게 사용할 수 있나요?

C `std::sort`에서 멤버 함수를 비교자로 어떻게 사용할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-02 18:00:21452검색

How Can I Use a Member Function as a Comparator in C   `std::sort`?

정렬을 위한 멤버 함수 비교기 구현

C에서 컬렉션을 정렬하려면 비교기 기능이 필요합니다. 멤버 함수를 비교자로 활용하려고 하면 컴파일 오류가 발생할 수 있습니다.

문제

다음 클래스를 고려하세요.

class MyClass {
    int * arr;
    // ...

    doCompare( const int & i1, const int & i2 ) { // uses member variables } 

    doSort() { std::sort(arr,arr+someSize, &doCompare); }
};

컴파일 이 코드는 오류를 생성할 수 있습니다.

ISO C는 주소를 가져오는 것을 금지합니다. 정규화되지 않거나 괄호로 묶인 비정적 멤버 함수를 사용하여 멤버 함수에 대한 포인터를 형성합니다.

해결책

이 문제를 해결하기 위한 한 가지 접근 방식은 doCompare를 정적 멤버 함수로 만드는 것입니다. . 그러나 doCompare가 MyClass 데이터에 액세스해야 하는 경우 MyClass를 비교 기능자로 변환할 수 있습니다.

이는 다음을 변경하여 달성할 수 있습니다.

doCompare( const int & i1, const int & i2 ) { // use some member variables }

다음으로:

bool operator () ( const int & i1, const int & i2 ) { // use member variables }

그런 다음 다음과 같이 정렬 함수를 호출합니다.

doSort() { std::sort(arr, arr+someSize, *this); }

추가로, doSort 메소드는 void와 같은 값을 반환해야 합니다.

또 다른 옵션은 다음 예에서 설명한 것처럼 클래스 내에 멤버 함수를 래핑하는 것입니다.

class MyClass {
    struct Less {
        Less(const MyClass& c) : myClass(c) {}
        bool operator () ( const int & i1, const int & i2 ) {// use 'myClass'} 
        MyClass& myClass;
    };
    doSort() { std::sort(arr, arr+someSize, Less(*this)); }
};

위 내용은 C `std::sort`에서 멤버 함수를 비교자로 어떻게 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.