分析:
对于两个string对象的比较,归根结底将会调用模板参数traits中的字符比较函数,正是这些字符比较函数确定了两个字符串的比较规则。类string使用标准库中定义的char_traits<char>作为模板参数traits来实例化basic_string.由于char_traits<char>采用大小写敏感的规则来比较,因此类string也会采用大小写敏感的规则来比较两个字符串。
demo:
/*
应用类模板char_traits实现大小写不敏感的字符串类 ci_string
*/
#include <string>
#include <iostream>
using namespace std;
struct ci_char_traits :public char_traits <char>
{
static bool eq(char c1,char c2)
{
return toupper(c1) == toupper(c2);
}
static bool lt(char c1, char c2)
{
return toupper(c1) <toupper(c2);
}
static int compare(const char *s1,const char *s2,size_t n)
{
//该函数比较两字符串 大小写不区分
return memicmp(s1,s2,n);
}
static const char *find(const char *s, int n, char a)
{
while (n-->0 && toupper(*s)!=toupper(a))
{
++s;
}
return n >= 0 ? s : 0;
}
};
int main()
{
typedef basic_string<char, ci_char_traits> ci_string;
ci_string s1("apple"), s2("APPLE");
if (s1==s2)
{
cout << "equal "<<s1.c_str()<< endl;
}
else
{
cout << "not equal" << endl;
}
return 0;
}