[5 算法] 35. 通过mismatch或lexicographical_compare实现忽略大小写的字符串比较

首先,需要一种办法来判断两个字符是否相同,而不去管它们的大小写:

1 mismatch

ciStringCompare根据两个字符串之间的关系返回一个负数、零或正数。

mismatch将标识出两个区间中第一个对应值不相同的位置。前提是,短的字符串作为第一个区间参数。mismatch返回一对迭代器,指示了这两个区间中对应字符第一次比较失败的位置:

int ciStringCompareImpl(const string& s1, const string& s2);

int ciStringCompare(const string& s1, const string& s2)
{
    if (s1.size() <= s2.size()) return ciStringCompareImpl(s1, s2);
    else return ciStringCompareImpl(s2, s1);
}

int ciStringCompareImpl(const string& s1, const string& s2)
{
    // PSCI = "pair of string::const_iterator"
    typedef pair<string::const_iterator, string::const_iterator> PSCI;

    PSCI p = mismatch(s1.begin(), s1.end(),
                      s2.begin()
                      not2(ptr_fun(ciCharCompare)));
    // 0:s1与s2相等;-1:s1比s2短
    if (p.first == s1.end()) {
        if (p.second == s2.end()) {
            return 0;
        } else {
            return -1;
        }
    }
    // p.first != s1.end()时等价于字符之间的比较
    return ciCharCompare(*p.first, *p.second);
}

2 lexicographical_compare

// 返回在忽略大小写的情况下,c1是否在c2之前
bool ciCharLess(char c1, char c2)
{
    return tolower(c1) < tolower(c2);
}

bool ciStringCompare(const string &s1, const string &s2)
{
    return lexicographical_compare(s1.begin(), s1.end(),
                                   s2.begin(), s2.end(),
                                   ciCharLess);
}

如果第一个区间的字符串小于第二个区间的字符串,那么lexicographical_compare返回true;如果第一个区间的字符串大于等于第二个区间的字符串,那么lexicographical_compare返回false。

参考资料:

https://blog.csdn.net/hp_cpp/article/details/109208622

Guess you like

Origin blog.csdn.net/u012906122/article/details/119681031
Recommended