2017-10-08 11 views
0

std::map의 최대 값을 반환하려고합니다. 나는이 같은 pred을 정의하면const에서 매개 변수를 사용하지 않을 때 C++ 컴파일러가 컴파일되지 않는 이유는 무엇입니까?

int main() { 
    int N; 
    cin >> N; 
    map<int,int > m; 
    while(N--) { 
     int x; cin >> x; 
     m[x]++; 
    } 
    cout << max_element(m.begin(), m.end(), pred)->first; 
    return 0; 
} 

, 그것을 작동 :

bool pred(const pair<int,int>& lhs, const pair<int,int>& rhs){ 
    return lhs.second < rhs.second; 
} 

을이 작동하지 않습니다, 반면 : const가 작동 할 수 있습니다 왜 이해가 안

bool pred(pair<int,int>& lhs, pair<int,int>& rhs){ 
    return lhs.second < rhs.second; 
} 

.

+2

매개 변수를'pair &'로 변경하고 다시 시도하십시오. 지도 키는 분명히 'const'입니다. 분명히 맵에서 특정 값의 키를 변경할 수는 없습니다. –

+0

그래,하지만 아무것도 바꾸려고 하는게 아니야. 왜 const가 필요한가요? – sbryan1

+0

당신은 합법적으로 프로그램의 어떤 부분에서 const를 캐스팅하거나 변환 할 수 없으므로 const가 필요합니다. 그것은 const 정확성이라 불리우며 C++에서는 타입 안전의 일부입니다. const가 아닌 참조를 취하는 함수에 const 일을 전달하려고하면 컴파일 오류가 발생합니다. const 일은 비 const 참조에 바인딩 할 수 없습니다. –

답변

0

std::map<K, V>의 값 유형은 std::pair<K, V>이 아니고 std::pair<K const, V> 이니 std::map<K, V> 요소의 키를 변경할 수 없습니다. 바람직하게는

bool pred(std::map<int, int>::reference lhs, std::map<int, int>::reference rhs) { ... } 

당신의 pred() 함수가 인수를 변경하지 않습니다,

bool pred(std::pair<int const, int>& lhs, std::pair<int const, int>& rhs) { ... } 

또는 : 당신은 당신의 pred() 함수의 인수에 대한 올바른 값 유형을 사용해야합니다. 상응하게 그것은 에 의한 인수를 받아 들일 수 있어야하고, std::map<K, V> const을 사용할 수 있어야합니다. 그러나, const지도가있는 기능 만 사용하는 경우 올바른 값 유형을 사용한다고 가정 할 필요가 없습니다. std::pair 이후

std::pair 다른 유형의 변환 연산자를 가지고, 그것은 [암시] std::pair<int const, int>에서 std::pair<int, int>로 변환 할 수있다. 그러나 결과는 임시 std::pair<int, int>이며 비 const 참조에 연결할 수 없습니다. int 값 쌍에 대해서는 큰 성능 차이는 없지만 암시 적 변환은 키 또는 값에 어떤 형식의 컨테이너가 들어있는 경우와 같이 주요 성능 문제 일 수 있습니다.

+0

감사합니다. 그건 분명했습니다. 실제로이 값을 변경하려고하는지 여부에 관계없이'const'를 사용해야하는이 "암시적인"변환이 어디에서 또있을 수 있습니까? – sbryan1

+0

@ sbryan1 : 다양한 연관 컨테이너의 'value_type'이 내가 알고있는 가장 일반적인 경우입니다. 'tuple' 류의 타입이 사용 된 타입과 정확히 일치하지 않는 멤버를 포함하는 다른 경우가있을 수 있습니다. 예를 들어,'std :: tuple '을'std :: tuple '에 할당하면 유사한 변환이 일어나 임시적인 결과를 얻을 수 있습니다. BTW, Stackoverflow 통화는 "감사합니다"가 아니라 답변을 수락합니다. –