정렬을 위한 멤버 함수 비교기 구현
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!