勤能补拙,厚积薄发

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下
随笔 - 19, 文章 - 0, 评论 - 3, 引用 - 0
数据加载中……

Effective STL, item 35

实现简单的忽略大小写的字符串的比较
#include <iostream> 
#include 
<string>
#include 
<algorithm>
#include 
<utility>
#include 
<functional>
using std::pair;
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::not2;
using std::ptr_fun;

int ciCharCompare(char c1, char c2)
{
    
int lc1 = tolower(static_cast<unsigned char>(c1));
    
int lc2 = tolower(static_cast<unsigned char>(c2));
    
if (lc1 < lc2) {
        
return -1;
    }
    
if (lc1 > lc2) {
        
return 1;
    }    
    
return 0;    
}

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)
{
    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;
        }
    } 
    
return ciCharCompare(*p.first, *p.second);
}

void PrintCompareResult(const string& s1, const string& s2)
{
    
if (ciStringCompare(s1, s2) > 0) {
        cout 
<< s1 << " > " << s2 << endl;
    } 
else if (ciStringCompare(s1, s2) < 0) {
        cout 
<< s1 << " < " << s2 << endl;
    } 
else {
        cout 
<< s1 << " = " << s2 << endl;
    }
}

int main()
{
    
string test1("FreeDomi");
    
string test2("FReedOmi");
    PrintCompareResult(test1, test2);
    test1[
6= 'Z';
    PrintCompareResult(test1, test2);
    test2[
6= 'z';
    PrintCompareResult(test1, test2);
    
return 0;
}

运行效果如下图




posted on 2012-02-14 15:39 lee007 阅读(239) 评论(0)  编辑 收藏 引用 所属分类: Programming Study


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理