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

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


such thing,

Как нам теперь удалить ненужные знаки препинания? Для начала определим строку, содержащую все символы, которые мы хотим удалить:

string filt elems( \ ,.;:!?)(\\/ );

(Обратная косая черта указывает на то, что следующий за ней символ должен в данном контексте восприниматься буквально, а не как специальная величина. Так, \ обозначает символ двойной кавычки, а не конец строки, а \\ - символ обратной косой черты.)

Теперь можно применить функцию-член find first of() для поиска всех вхождений

while (( pos = word.find first of( filt elems, pos ))

нежелательных символов:

!= string::npos )

Найденный символ удаляется с помощью функции-члена erase() :

word.erase(pos,1);

Первый аргумент этой функции означает позицию подстроки, а второй - ее длину. Мы удаляем один символ, находящийся в позиции pos. Второй аргумент является необязательным; если его опустить, будут удалены все символы от pos до конца строки.

Вот полный текст функции filter text() . Она имеет два параметра: указатель на

void

filter text( vector<string> *words, string filter )

vector<string>::iterator iter = words->begin(); vector<string>::iterator iter end = words->end();

filter не задан, зададим его сами

if ( ! filter.size() )

filter.insert( 0, \ ., );

while ( iter != iter end ) { string::size type pos = 0;

удалим кажд найденн элемент

while (( pos = (*iter).find first of( filter, pos )) != string::npos ) (*iter) .erase(pos,1); iter++;

вектор строк, содержащий текст, и строку с символами, которые нужно убрать.

Почему мы не увеличиваем значение pos на каждой итерации? Что было бы, если бы мы написали:



while (( pos = (*iter).find first of( filter, pos )) != string::npos )

(*iter).erase(pos,1); ++ pos; неправильно...

Возьмем строку

thing,

На первой итерации pos получит значение 5 , т. е. позиции, в которой находится запятая. После удаления запятой строка примет вид

thing

Теперь в 5-й позиции стоит двойная кавычка. Если мы увеличим значение pos, то пропустим этот символ.

string filt elems( \ ,.;:!?)(\\/ );

Так мы будем вызывать функцию filter text() :

filter text( text locations->first, filt elems );

А вот часть распечатки, сделанной тестовой версией filter text():

filter text: untamed. found! : pos: 7. after: untamed

filter text: Daddy,

found! : pos: 0. after: Daddy, found! : pos: 5. after: Daddy

filter text: thing, found! : pos: 5. after: thing found! : pos: 5. after: thing

filter text: I found! : pos: 0.

after: I

filter text: Daddy,

found! : pos: 5. after: Daddy

filter text: there?

found! : pos: 5. after: there found! : pos: 5.

after: there



string sentence( kind string s1 ( whistle )

of );

Напишите программу, которая с помощью разных функций вставки из строк

string s2 ( pixie )

составит предложение

i A whistling-dixie kind of walk

6.10. Приводим слова к стандартной форме

Одной из проблем при разработке текстовых поисковых систем является необходимость распознавать слова в различных словоформах, такие, как cry, cries и cried, baby и babies, и, что гораздо проще, написанные заглавными и строчными буквами, например home и Home. Первая задача, распознавание словоформ, слишком сложна, поэтому мы приведем здесь ее заведомо неполное решение. Сначала заменим все прописные буквы

void

strip caps( vector<string,allocator> *words ) {

vector<string,allocator>::iterator iter=words->begin() vector<string,allocator>::iterator iter end=words->end(

string caps( ABCDEFGHIJKOPQRSTUVWXYZ );

while ( iter != iter end ) { string::size type pos = 0;

while (( pos= (*iter).find first of( caps, pos )) != string::npos )

(*iter)[ pos ] = to1ower( (*iter)[pos] ); ++iter;

строчными:

Функция

to1ower( (*iter)[pos] ) ;

Упражнение 6.15

Напишите программу, которая удаляет все символы, кроме STL из строки:

p/.+(STL).$1/ I

используя сначала erase(pos,count) , а затем erase(iter,iter) . Упражнение 6.16



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

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