|
Программирование >> Инициализация объектов класса, структура
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |