std::map 比较行为怪异

问题描述 投票:0回答:1

最近,我在做一道leetcode问题。在这个问题中,我尝试创建一个地图;我不想根据字母顺序比较字符串,而是根据长度来比较它们。然而,地图最终出现了奇怪的条目计数。

int maximumLength(string s) {
    int n = (int)s.length();        
    auto comp = [&](const string& s1, const string& s2)  { return (int)s1.length() < (int)s2.length(); };
    map<string, int, decltype(comp)> msi(comp);
    // map<string, int, LengthComparator> msi;
    for (auto i = 0; i < n; i++)    {
        for (auto j = 1; j < n - i + 1; j++)    {
            string tmp = s.substr(i, j);
            cout << tmp << endl;
            msi[tmp] += 1;
        }
        debug(msi);
    }
    int res = -1;
    for (auto it = rbegin(msi); it != rend(msi); it++)  {
        cout << it->first << " " << it->second << endl;
        // if (it->second >= 3)    {
        //     res = (int)it->first.length();
        //     break;
        // }
    }
    return res;
}

int32_t main() {
    
    string input{"abcdef"};
    cout << maximumLength(input) << endl;

    return 0;
}

标准输出:

a
ab
abc
abcd
abcde
abcdef
[msi] = [{("a",1),("ab",1),("abc",1),("abcd",1),("abcde",1),("abcdef",1)}]
b
bc
bcd
bcde
bcdef
[msi] = [{("a",2),("ab",2),("abc",2),("abcd",2),("abcde",2),("abcdef",1)}]
c
cd
cde
cdef
[msi] = [{("a",3),("ab",3),("abc",3),("abcd",3),("abcde",2),("abcdef",1)}]
d
de
def
[msi] = [{("a",4),("ab",4),("abc",4),("abcd",3),("abcde",2),("abcdef",1)}]
e
ef
[msi] = [{("a",5),("ab",5),("abc",4),("abcd",3),("abcde",2),("abcdef",1)}]
f
[msi] = [{("a",6),("ab",5),("abc",4),("abcd",3),("abcde",2),("abcdef",1)}]
abcdef 1
abcde 2
abcd 3
abc 4
ab 5
a 6
-1

我的弦上不可能有 6 个 a。所以我想知道哪里出了问题。如果我删除 comp 函数,它的行为将按预期进行。我正在使用 c++ 23 (leetcode 默认)。尝试在 C++14 及以上版本上运行,同样的问题。

c++ stdmap
1个回答
0
投票

您的代码按预期工作 - 您的比较器(仅)根据长度比较字符串,因此无论字符串内容如何,任何两个相同长度的字符串都将比较相等。

因此,您的映射最终会保存具有给定长度的任何字符串的出现次数,其中存储的键只是看到的该长度的第一个字符串。 您有 6 个长度为 1 的字符串,其中第一个是

"a"
,因此您得到的计数为 6。 同样,您有 5 个长度为 2 的字符串,其中第一个是
"ab"

© www.soinside.com 2019 - 2024. All rights reserved.