字符串作为地图中的键,自定义比较功能

时间:2017-05-04 01:30:50

标签: c++ c++11 comparator stdstring stdmap

我在地图中使用字符串作为键值并尝试自定义比较函数。当我通过比较字符串的长度来自定义比较函数时,映射无法告诉具有相同大小的不同字符串。代码如下:

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

如果我的输入结果为["aba","cdc","eae","abcd"],则代码只会输出:"abcd""aba"

1 个答案:

答案 0 :(得分: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的角度来看,code就是一样。