【问题标题】:string as key in map, custom the compare function字符串作为map中的key,自定义比较函数
【发布时间】:2017-05-04 01:30:49
【问题描述】:

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

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"

【问题讨论】:

  • 了解“这个”吗?明白什么?

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


【解决方案1】:

地图无法区分大小相同的不同字符串。

请注意,提供给std::map 的比较器不仅用于排序,还用于相等性检查。

标准库在任何地方都使用Compare 概念,唯一性 由等价关系确定。在不精确的情况下, 两个对象 a 和 b 被认为是等效的(不唯一的),如果两者都不是 比较小于另一个:!comp(a, b) &amp;&amp; !comp(b, a)

std::map 存储具有唯一键的元素。你的比较函子根据它们的长度比较strings,然后对于这些具有相同长度的strings,只存储其中一个。从map&lt;string, int, decltype(cmpByStringLength)&gt;"aba""cdc""eae"的角度来看,strings是一样的。

【讨论】:

  • 啊,我误解了compare函数的使用。我认为它只是使用比较功能来决定键值的顺序。我又看了一遍比较函数:cplusplus.com/reference/map/map 所以从p2开始,这个函数也用来判断两个元素是否相等。非常感谢。
  • @JianSun 是的,它使用比较器不仅用于排序,还用于相等检查。如果它使用其他固定的东西来进行相等检查,例如operator==,而std::map 没有提供指定它的方法,则无法自定义它。
猜你喜欢
  • 2014-02-05
  • 2018-05-20
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多