新知识点: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;
}