首先,需要一种办法来判断两个字符是否相同,而不去管它们的大小写:
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。
参考资料: