2017-05-04 20 views
-1

map에서 문자열을 키 값으로 사용하고 비교 함수를 사용자 정의하려고합니다. 문자열을 길이 비교하여 비교 함수를 사용자 정의 할 때 맵은 동일한 크기의 다른 문자열을 전달하지 못합니다. 코드는 다음과 같습니다 내 입력 strs가 ["aba","cdc","eae","abcd"]입니다문자열을지도의 키로 사용하여 비교 함수를 사용자 지정합니다.

class Solution { 
public: 
int findLUSlength(vector<string>& strs) { 
    if(strs.size() < 2) return -1; 
    auto cmpByStringLength = [](const string &s1, const string &s2)->bool 
         { 
          return s1.size() < s2.size(); 
         }; 
    map<string, int, decltype(cmpByStringLength)> mpstringcount(cmpByStringLength); 
    for(int i = 0; i < strs.size(); i++) 
     mpstringcount[strs[i]]++; 
    for(auto itmp = mpstringcount.begin(); itmp != mpstringcount.end(); itmp++) 
    { 
     cout << "itmp->first: " << itmp->first << endl; 
    } 
    return -1; 
} 
}; 

경우 코드 것입니다 단지 출력 : "abcd""aba".

+1

"this"를 이해 하시겠습니까? 뭘 이해해? –

답변

2

지도가 동일한 크기의 다른 문자열을 말하지 않습니다.

std::map에 제공된 비교기는 순서 지정뿐만 아니라 등호 검사에도 사용됩니다. 고유성 표준 라이브러리가 Compare 개념을 사용 지역

는 등가 관계를 이용하여 결정된다. 부정확 한 용어로 두 개의 객체 a와 b는 이 다른 것보다 작지 않은 경우 !comp(a, b) && !comp(b, a)이 아닌 동등한 것으로 간주됩니다 (고유하지 않음).

std::map은 고유 키가있는 요소를 저장합니다. 비교 펑터는 길이에 따라 string을 비교하고, 다음에 동일한 길이를 갖는 string에 대해 그 중 하나만 저장됩니다. map<string, int, decltype(cmpByStringLength)>의 관점에서, "aba", "cdc", "eae"은 단지 string과 동일합니다.

+0

아, 나는 compare 함수의 사용에 대해 오해했다. 난 그냥 비교 기능을 사용하여 키 값의 순서를 결정하는 줄 알았는데. 비교 함수를 다시 읽습니다. http://www.cplusplus.com/reference/map/map/ 따라서 p2에서 함수는 두 요소가 같은지 결정하는 데 사용됩니다. 고마워. –

+0

@ JianSun 네, 순서 지정뿐만 아니라 동일성 검사를 위해 비교기를 사용합니다. 'operator =='와 같이 동등성 검사를 위해 고정 된 다른 것을 사용하고,'std :: map'은 그것을 지정하는 메소드를 제공하지 않습니다. 사용자 정의 할 수 없습니다. – songyuanyao