|
Программирование >> Инициализация объектов класса, структура
void suffix text( vector<string,allocator> *words ) { vector<string,allocator>::iterator iter = words->begin(), iter end = words->end(); while ( iter != iter end ) { оставим слова короче трех букв как есть if ( (*iter).size() <= 3 ) { ++iter; continue; } if ( (*iter)[ (*iter).size()-1 ] == s ) suffix s( *iter ); здесь 1л1 мог бы обработать суффиксы ed, ing, 1y ++iter; концах слов: Слова из трех и менее букв мы пропускаем. Это позволяет оставить без изменения, например, has, its, is и т.д., однако слова tv и tvs мы не сможем распознать как одинаковые. string::size type pos() = word.size()-3; string ies( ies ); if ( ! word.compare( pos3, 3, ies )) { word.replace( pos3, 3, 1, у ); return; Если слово кончается на ies , как babies и cries, необходимо заменить ies на y : входит в стандартную библиотеку С. Она заменяет прописную букву соответствующей ей строчной. Для использования tolower() необходимо включить заголовочный файл: #include <ctype.h> (В этом файле объявлены и другие функции, такие, как isalpha(), isdigit(), ispunct(), isspace(), toupper (). Полное описание этих функций см. [PLAUGER92]. Стандартная библиотека С++ включает класс ctype, который инкапсулирует всю функциональность стандартной библиотеки Си, а также набор функций, не являющихся членами, например toupper() , tolower() и т.д. Для их использования нужно включить заголовочный файл #include <locale> Однако наша реализация компилятора еще не поддерживала класс ctype, и нам пришлось использовать стандартную библиотеку Си.) Проблема словоформ слишком сложна для того, чтобы пытаться решить ее в общем виде. Но даже самый примитивный вариант способен значительно улучшить работу нашей поисковой системы. Все, что мы сделаем в данном направлении, - удалим букву s на string ses( ses ); if ( ! word.compare( pos3, 3, ses )) { word.erase( pos3+l, 2 ); return; суффикс es 16: Если слово кончается на ous , как oblivious, fulvous, cretaceous, или на is , как genesis, mimesis, hepatitis, мы не будем изменять его. (Наша система несовершенна. Например, в слове kiwis надо убрать последнее s.) Пропустим и слова, оканчивающиеся на ius (genius) или на ss (hiss, lateness, less). Нам поможет string::size type spos = 0; string::size type pos3 = word.size()-3; ous , ss , is , ius string suffixes( oussisius ); if ( word.compare( pos3, 3, suffixes, spos, 3 ) ous word.compare( pos3, 3, suffixes, spos+6, 3 ) ius word.compare( pos3+l, 2, suffixes, spos+2, 2 ) ss word.compare( pos3+l, 2, suffixes, spos+4, 2 ) ss is вторая форма функции compare() : return; удалим последнее s В противном случае удалим последнее s: word.erase( pos3+2 ); 16 Конечно, в английском языке существуют исключения из правил. Наш эвристический алгоритм превратит crises (множ. число от crisis - прим. перев.) в cris. Ошибочка! compare() возвращает 0, если две строки равны. Первый аргумент, pos3, обозначает начальную позицию, второй - длину сравниваемой подстроки (в нашем случае 3). Третий аргумент, ies, - строка-эталон. (На самом деле существует шесть вариантов функции compare() . Остальные мы покажем в следующем разделе.) replace() заменяет подстроку набором символов. В данном случае мы заменяем подстроку ies длиной в 3 символа единичным символом y. (Имеется десять перегруженных вариантов функции replace() . В следующем разделе мы коснемся остальных вариантов.) Если слово заканчивается на ses , как promiises или purposes, нужно удалить 6.11. Дополнительные операции со строками Вторая форма функции-члена erase() принимает в качестве параметров два итератора, ограничивающих удаляемую подстроку. Например, превратим string name ( AAnnaLiviaPlurabelle ); typedef string::size type size type; size type startPos = name.find( L ) size type endPos = name.find 1ast of( b ); name.erase( name.begin()+startPos, в строку Annabelle : name.begin()+endPos ); Символ, на который указывает второй итератор, не входит в удаляемую подстроку. Для третьей форм: параметром является только один итератор; эта форма удаляет все символы, начиная с указанной позиции до конца строки. Например: name.erase( name. begin()+4 ); оставляет строку Anna . Функция-член insert () позволяет вставить в заданную позицию строки другую строку или символ. Общая форма выглядит так: string object.insert( position, new string ); position обозначает позицию, перед которой производится вставка. new string может string string object( Issisippi ); string::size type pos = string object.find( isi ); быть объектом класса string, C-строкой или символом: string object.insert( pos+1, s ); Имена собственные, например Pythagoras, Brahms, Burne-Jones, не подпадают под общие правила. Этот случай мы оставим как упражнение для читателя, когда будем рассказывать об ассоциативных контейнерах. Но прежде чем перейти к ним, рассмотрим оставшиеся строковые операции. Упражнение 6.17 Наша программа не умеет обрабатывать суффиксы ed (surprised), ly (surprisingly) и ing (surprisingly). Реализуйте одну из функций для этого случая: (a) suffix ed() (b) suffix ly() (c) suffix ing()
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |