Параметр и возвращаемое значение функции tolower, как и у многих функций
При наличии chCharCompare
первая из двух функций сравнения строк (с интерфейсом в стиле strcmp) пишется просто. Эта функция, ciStringCompare
, возвращает отрицательное число, ноль или положительное число в зависимости от отношения между сравниваемыми строками. Функция основана на алгоритме mismatch
, определяющем первую позицию в двух интервалах, в которой элементы не совпадают.
Но для вызова mismatch должны выполняться некоторые условия. В частности, необходимо проследить за тем, чтобы более короткая строка (в случае строк разной длины) передавалась в первом интервале. Вся настоящая работа выполняется функцией ciStringCompareImp
, а функция ciStringCompare
лишь проверяет правильность порядка аргументов и меняет знак возвращаемого значения, если аргументы пришлось переставлять:
int ciStringCompareImpl(const string& si, // Реализация приведена далее
const string& s2);
int ciStringCompare(const string& s1,const string& s2) {
if (s1.size()<=s2.size() return cStringCompareImpl(s1,s2);
else return -ciStringComparelmpl(s2,s1);
}
Внутри ciStringCompareImpl
всю тяжелую работу выполняет алгоритм mismatch. Он возвращает пару итераторов, обозначающих позиции первых отличающихся символов в интервалах:
int ciStringCompareImpl(const string& si,const string& s2) {
typedef pair
PSCI p = mismatch( // Использование ptr_fun
s1.begin(),s1,end(), // рассматривается
s2.begin(), // в совете 41
not2(ptr_fun(сiCharCompa
if (p.first==s1.end()) { // Если условие истинно,
if (p.second==s2.end()) return 0; // либо si и s2 равны.
else return -1; // либо s1 короче s2
}
return ciCharCompare(*p.first,*p.second); // Отношение между строками }// соответствует отношению
// между отличающимися
// символами