2017-11-21 1 views
1

우리는 왜 이렇게 수행하십시오 operator() 기능이 struct less_than_key에 포함 된 이유는 여기에 위의 코드에서커스텀 객체의 벡터를 정렬하는 동안 struct의 정의 내부에 compare 함수를 포함시키는 이유는 무엇입니까?

struct MyStruct 
{ 
    int key; 
    std::string stringValue; 

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {} 
}; 

struct less_than_key 
{ 
    inline bool operator() (const MyStruct& struct1, const MyStruct& struct2) 
    { 
     return (struct1.key < struct2.key); 
    } 
}; 

std::vector <MyStruct> vec; 

vec.push_back(MyStruct(4, "test")); 
vec.push_back(MyStruct(3, "a")); 
vec.push_back(MyStruct(2, "is")); 
vec.push_back(MyStruct(1, "this")); 

std::sort(vec.begin(), vec.end(), less_than_key()); 

스 니펫. 구조체 정의에서 제거하면 어떻게됩니까?

+1

당신은 functor 대신 정규 함수를 사용합니까? – Jarod42

+1

"구조체 정의에서 제거하면 어떻게됩니까?"시도해 보셨습니까? – Jodocus

답변

0

std::sort 문서에 따르면, 자사의 Compare 유형의 인수가

비교 함수 객체를해야합니다 (즉, 비교의 요구 사항을 만족 객체) 첫 번째 인수보다 작 으면 true를 반환 (예이다 전에 주문했다). 즉

std::sort의 세 번째 인수의이 버전은 함수 또는 함수 객체의 operator()으로 호출 할 수있는 무언가가 있어야합니다. less_than_key에서 해당 연산자없이

std::sort(vec.begin(), vec.end(), less_than_key()); 

은 (컴파일되지 않습니다) 잘못 형성된다. C++ 11 다음으로


, 당신은 쓸 수 :

std::sort(vec.begin(), vec.end(), 
    [] (const MyStruct& lhs, const MyStruct& rhs) { 
     return (lhs.key < rhs.key); 
}); 
4

내가 구조체 정의에서 그것을 가지고가는 경우에 어떤 일이 일어날까요?

당신이 지능적으로 수행한다고 가정하면, 끔찍한 일은 아닙니다. 샘플을 다음과 같이 쉽게 다시 작성할 수 있습니다.

하지만 이제 간접 호출을 통해 비교가 이루어집니다. 알고리즘은 함수 포인터를 통해 함수를 호출해야합니다. 그것은 인라인하기가 더 어려울 수 있습니다.

한편 functor 개체을 통한 호출은 정적으로 처리됩니다. 컴파일러에는 더 많은 유형 정보가 있습니다. 함수가 구성원 인 유형을 알고 있습니다. 전화를 직접 해결합니다. 그리고 그것은 더 쉽게 인라인 될 수 있습니다.

차이점은 컴파일러가 주어진 유형 정보에서 얻을 수있는 양입니다.

또한 새로운 유형의 이름을 선택하는 번거 로움없이 위에서 모두를 수행 할 수 있습니다. C++ 11에서는 람다 식과 클로저 유형을 도입했습니다. 당신은 쉽게 관용적 형태로 코드를 다시 작성할 수 있습니다 :

std::sort(vec.begin(), vec.end(), [](const MyStruct& s1, const MyStruct& s2){ 
    return (s1.key < s2.key); 
}); 

명명 된 구조체 버전에 있던대로 존재하는만큼 많은 종류의 정보가있다. 보일러 플레이트를 다루는 번거 로움을 덜어 주며 비교 기준을 호출하여 임무를 분류 할 수 있습니다.

+0

* 경우에 따라 컴파일러는 여전히 자유 함수 버전을 인라인 할 수 있습니다. 특히이 변환 단위에서 'MyStruct'를 사용하여 정렬하는 유일한 비교기 일 때 더욱 그렇습니다.함수 오브젝트 버전은 ** 인라인으로 ** 더 쉽게 ** 있습니다. – Caleth

관련 문제