Параметр и возвращаемое значение функции tolower, как и у многих функций , относятся к типу int, но эти числа (кроме EOF) должны представляться в виде unsigned char. В С и С++ тип char может быть как знаковым, так и беззнаковым (в зависимости от реализации). Если тип char является знаковым, гарантировать его возможное представление в виде unsigned char можно лишь одним способом: преобразованием типа перед вызовом tolower, этим и объясняется присутствие преобразований в приведенном выше фрагменте (в реализациях с беззнаковым типом char преобразование игнорируется). Кроме того, это объясняет сохранение возвращаемого значения tolower в переменной типа int вместо char.

При наличии 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(сiCharCompare)));

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); // Отношение между строками }// соответствует отношению

// между отличающимися

// символами

Перейти на страницу:

Все книги серии Библиотека программиста

Похожие книги