2017-05-04 14 views
-1

マップのキー値として文字列を使用しており、比較関数をカスタムしようとしています。文字列の長さを比較して比較関数をカスタム化すると、同じサイズの異なる文字列をマップに渡すことができません。以下のようにコードは次のとおりです。マップの文字列としての文字列、比較関数のカスタム

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; 
} 
}; 

私の入力STRS場合["aba","cdc","eae","abcd"]で、コードになるだけで、出力:"abcd""aba"

+1

"this"を理解していますか?何を理解する? –

答えて

2

マップは同じサイズの異なる文字列を伝えることができません。

std::mapに提供されるコンパレータは、注文に使用されるだけでなく、同等性チェックにも使用されます。 一意の標準ライブラリはCompare概念を使用してどこ

は、同値関係を用いて決定されます。不正確な用語では、 と比較して小さいものが!comp(a, b) && !comp(b, a)でない場合、2つのオブジェクトaとbは同等(同一ではない)とみなされます。

std::mapは、固有のキーを持つ要素を格納します。あなたの比較ファンクタは、その長さに基づいてstringを比較し、同じ長さを持つstringの場合、そのうちの1つだけが保存されます。 map<string, int, decltype(cmpByStringLength)>の観点からは、"aba","cdc","eae"はちょうど同じstringsである。

+0

ああ、私はcompare関数の使用を誤解しました。私はそれが単にキー値の順序を決定するために比較関数を使用していると思った。私はcompare関数を再度読んでいます:http://www.cplusplus.com/reference/map/map/したがって、p2から関数は、2つの要素が等しいかどうかを判断するためにも使用されます。どうもありがとう。 –

+0

@ JianSunはい、注文するだけでなく、等価チェックのためにコンパレータを使います。 'operator =='のように等価チェックのために他のものが使われている場合、 'std :: map'はそれを指定するメソッドを提供しません。それをカスタマイズすることはできません。 – songyuanyao