C++ 具有数组键C+的二进制映射+;

C++ 具有数组键C+的二进制映射+;,c++,data-structures,C++,Data Structures,这是我在黑客级别上提出的sherlockAndAnagrams解决方案。目标是找到字符串中匹配的子字符串的数量。例如,“abba”将有字谜,[“a”,“a”],[“ab”,“ba”],[“abb”,“bba”],[“b”,“b”] 为了解决这个问题,我尝试创建一个二进制映射,使用数组作为键。然而,我编写的比较器函数并不能捕获每个测试用例。对于我之前给出的示例(“abba”),它会查找所有匹配项,但不匹配[“b”,“b”] 我对比较器的功能是否有一些不太了解的地方?我相信它满足严格弱序 struc

这是我在黑客级别上提出的sherlockAndAnagrams解决方案。目标是找到字符串中匹配的子字符串的数量。例如,“abba”将有字谜,[“a”,“a”],[“ab”,“ba”],[“abb”,“bba”],[“b”,“b”]

为了解决这个问题,我尝试创建一个二进制映射,使用数组作为键。然而,我编写的比较器函数并不能捕获每个测试用例。对于我之前给出的示例(“abba”),它会查找所有匹配项,但不匹配[“b”,“b”]

我对比较器的功能是否有一些不太了解的地方?我相信它满足严格弱序

struct cmpByArray {
    bool operator()(const array<unsigned int, 26>& a, const array<unsigned int, 26>& b) const {
        for(size_t i=0; i<a.size(); i++)
        {
            if(a[i] < b[i])
                return true;
        }
        return false;
    }
};


int sherlockAndAnagrams(string s) {
    int matches = 0;
    map< array<unsigned int, 26>, int, cmpByArray> m1;
    for(size_t i=0; i<s.length(); i++)
    {
        cout << s[i] << std::endl;
        for(size_t j=i; j<s.length(); j++)
        {
            cout << '-';
            array<unsigned int, 26> arr = {0};
            for(size_t k=i; k<=j; k++)
            {
                cout << s[k]; 
                arr[s[k]-'a']++;
            }
            cout << endl;
            if( m1.find(arr) != m1.end())
            {
                matches++;
                cout << "match: " << endl;
            } 
            else
            {
                m1[arr]++;
            }
        }
    }
    return matches;
}
struct cmpByArray{
布尔运算符()(常量数组&a、常量数组&b)常量{
对于(尺寸i=0;i m1;

对于(size_t i=0;i您有UB,因为您的比较器不满足严格的弱排序要求

你有

    if(a[i] < b[i])
            return true;
考虑案例
{1,2}<{0,3}

如果没有第二次检查,您将更简洁地返回
true

:如果(a[i]!=b[i]),则返回a[i]
(否则继续循环)。我认为OP的问题是学术性的,因为内置运算符Thank是有意义的。一个快速的后续问题,映射如何知道两个键何时相等?它是否具有类似无序_映射的相等函数?当a if(a[i] > b[i]) return false;