新知识点:not1、not2、not3……not127 not1和not2例子: not1是构造一个与谓词结果相反的一元函数对象,not2是构造一个与谓词结果相反的二元函数对象
#include<iostream> #include<algorithm> #include<vector> #include<functional> using namespace std; int ciCharCompare(char c1, char c2)//忽略大小写的比较函数 { //如果char是带符号的,则将char转换为不带符号的. int t1 = tolower(static_cast<unsigned char>(c1)); int t2 = tolower(static_cast<unsigned char>(c2)); if (t1 < t2) return -1; if (t1 > t2) return 1; return 0; } int ciStringCompareImpl(const string& s1, const string& s2) { typedef pair<string::const_iterator, string::const_iterator> PSCI; PSCI p = mismatch(s1.begin(), s1.end(), s2.begin(), not2(ptr_fun(ciCharCompare))); if (p.first == s1.end()) { if (p.second == s2.end()) { return 0;//相等 } else { return -1;//s1比s2短 } } //字符之间的关系和这两个不匹配的字符之间的关系相同 return ciCharCompare(*p.first, *p.second); } int ciStringCompare(const string& s1, const string& s2) { //写这个函数的原因是,我们必须先满足它的前提条件。特别是,如果两个字符串的 //的长度不一样,那么我们必须把短的字符串作为第一个区间传入 if (s1.size() <= s2.size()) { return ciStringCompareImpl(s1, s2); } else { return -ciStringCompareImpl(s1, s2); } } int main() { //实现忽略大小写的字符串比较:function1 string s1("Hahahah"); string s2("hahahah"); cout << ciStringCompare(s1, s2) << endl; return 0; }需要注意的是,mismatch返回的是区间中第一个对应值不相同的位置的值。必须满足mismathc,如果两个字符串的长度不一样,我们必须把短的字符串放在第一个区间传入。
function2:
bool ciCharLess(char c1, char c2) { return tolower(static_cast<unsigned char>(c1)) < tolower(static_cast<unsigned char>(c2)); } int ciStringCompare(const string& s1, const string& s2) { //lexicographical_compare是strcmp的一个泛华的版本,他可以用来任意对象之间的比较 //而不只是字符串之间 return lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(), ciCharLess); } int main() { //实现忽略大小写的字符串比较:function1 string s1("Hahahah"); string s2("hahahah"); cout << ciStringCompare(s1, s2) << endl; return 0; }如果愿意牺牲一点移植性,并且你知道你的字符串中不包括内嵌的空字符,而且不用考虑国际化的支持,那么可能会发现,忽略大小写的字符串比较最容易的方法根本不用使用STL。
function3
int ciStringCompare(const string& s1, const string& s2) { return _strcmpi(s1.c_str(), s2.c_str()); } int main() { //实现忽略大小写的字符串比较:function1 string s1("Hahahah"); string s2("hahahah"); cout << ciStringCompare(s1, s2) << endl; return 0; }