Программирование >>  Инициализация объектов класса, структура 

1 ... 90 91 92 [ 93 ] 94 95 96 ... 395


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()



1 ... 90 91 92 [ 93 ] 94 95 96 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика